C语言

C语言和C++的区别

时间:2024-10-16 01:37:13 C语言 我要投稿
  • 相关推荐

C语言和C++的区别精选

  C和C++的关系:就像是win98跟winXP的关系。C++是在C的基础上增加了新的理论,玩出了新的花样。所以叫C加加。以下是小编为大家收集的C语言和C++的区别精选,欢迎大家借鉴与参考,希望对大家有所帮助。

  C语言和C++的区别1

  C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

  C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

  下面我们一步一步来分析C++与C的不同:

  一、类,类对于初学者,它是一个累赘。类的封装使得初学者对程序产生厌倦,感到不适和麻烦。

  二、引用,引用是C++中最好尽量不要用它,除非万不得已。引用对于初学者就更容易产生混淆,不知道哪个是引用,哪个是变量。

  三、函数的重载,初学者学函数的重载好像没什么坏处,但是,这会使初学者潜意识里对C语言的变量类型的重要性产生淡化,要记住C语言是对变量类型最敏感了的,变量的类型在C语言里的'重要性是不言而喻的。

  四、流操作符,和上面同样的道理,使得对变量类型的重要性产生淡化,有时会产生使初学者莫名其妙的结果。

  五、操作符重载,典型的高级应用,初学者可能根本用不着,这个东东会让他们觉得C++很难,门槛高,看不懂。

  六、继承,以及虚函数,看起来深奥,实用价值很低。还有些东东我就不发表评论了,如:new,操作符等

  七、误区:以问答形式:

  问:C++是面向对象化的而C是面向过程化的?

  答:第二对,第一问错,C++并非完全面向对象化,真正的面向对象化的语言恐怕只有Java才算得上。

  问:C++能实现C所不能的功能吗?

  答:至少我还没有发现

  问:学了C再学C++有障碍吗?比如程序设计思想

  答:至少我还没有看见谁有此症状。

  问:学了C再学C++又要重头开始吗?

  答:不,C++下可以实现C语言的一切功能。

  问:我学完了C一定还要学C++才能编程吗?

  答:完全没必要。

  问:C++比C好在哪里?

  答:更加符合软件工程学

  问:学完了C再学C++是不是很容易?

  答:那要看你是不是真正的学完了C语言。

  C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

  对语言本身而言,C是C++的子集,那么是什么样的一个子集?从上文可以看出, C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。 再提高一点,在C++中,数据封装、类型这些东东已不是什么新鲜事了,需要考虑的是诸如:对象粒度的选择、对象接口的设计和继承、组合与继承的使用等等问题。

  所以相对于C,C++包含了更丰富的“设计”的概念,但C是C++的一个自洽子集,也具有强大的功能,同样值得学习

  小编给的几点学习建议:

  1.基本概念很重要。无论学C,还是学C++,基本概念都是第一位的,也是比较困难的,但只有把握了基本概念才能把握整体脉络,才能居高临下。

  2.C是C++的子集,它的基本概念和设计方法相对比较容易理解,初学者可从它入手。

  3.如果要学好C++,建议初学者最好别在如VC,BCB平台下写程序,那种自动化的代码生成,花花绿绿的界面,会让你手足无措。最好先找一片空地(unix,dos),从头做起,写几个大点的程序,数个回合,再到VC,BCB下看看,你会轻松得很。在我看来,学好C/C++是成为VC,BCB高手的必由之路。

  4.不要妄想速成,必须得一个byte,一个bit的去抠,尽量搞清楚每一个问题。

  C语言和C++的区别2

  C语言和C++的区别是一个老生常谈的问题了,建议题主也善用知乎或者外部的搜索,可以很多角度和很多观点给你带来信息。

  仅针对你问题描述的问题,是否可以直接上手C++,我的答案是可以,因为我就是这样子走过来的。

  1、 源代码文件的扩展名

  摘自1.4.1

  C++实现源代码文件的扩展名UNIXC、cc、cxx、cGNU C++C、cc、cxx、cpp、c++Digital Marscpp、cxxBorland C++cppWatcomcppMicrosoft Visual C++cpp、cxx、ccFreestyle Code Warriorcp、cpp、cc、cxx、c++

  另外UNIX系统上的C程序的扩展名为.c

  2、变量定义

  摘自2.2.1

  c语言中,所有的局部变量必须在函数或复合语句开始位置,c++没有这个限制。

  void main()

  {

  int a; //define variable a

  int b; //define variable b

  a = 10;

  printf("a=%d ", a);

  b = 11;

  printf("b=%d ", b);

  {

  int temp = 0;

  printf("test variable in processing ");

  }

  }

  注释:

  a、局部变量a和b位于函数开始位置,变量temp位于复合语句的开始位置。

  b、复合语句(摘自5.1.10):使用两个花括号来构造一条复合语句(代码块)。代码块由一对花括号和它们包含的语句组成。

  3、 auto

  摘自3.4.5

  c语言中, auto用于声明变量为自动变量,auto修饰符的定义里有这么一句“进入包含变量声明的代码时,变量开始存在。当程序离开这个代码块时,自动变量消失了。它所占用的内存可用来做别的事情。”,从“当程序离开代码块时变量消失”、“内存可用来做别的事情”可以推出auto修饰的变量是存储在堆栈中的。而全局变量存储在静态存储区中,所以用auto决不能修饰全局变量。

  C++11标准引入auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。

  与原来那些只对应一种特定类型的说明符不同,auto让编译器通过初值来推算变量类型。显然,auto定义的变量必须要有初始值。

  auto i=0,*p=&i; //正确,i是整数,p是整形指针

  4、stuct

  摘自4.4

  在C语言中, struct类型的定义必须加上struct的前缀

  struct opt {

  int len;

  int value;

  };

  void main()

  {

  struct opt tmp;

  tmp.len = 1;

  tmp.value = 2;

  }

  而在C++中,struct可以直接使用其类型名来定义

  #include <iostream>

  struct opt {

  int len;

  int value;

  };

  int main()

  {

  opt tmp;

  tmp.len = 1;

  tmp.value = 2;

  std::cout<<tmp.len<<std::endl;

  std::cout<<tmp.value<<std::endl;

  return 0;

  }

  相比之下,C++的语法更简洁一些。所以在用C语言编写代码的时候,C程序员通常是这么来定义的struct的。在下面的代码中,使用typedef来定义一个opt的类型

  typedef struct _opt {

  int len;

  int value;

  }opt;

  void main()

  {

  opt tmp;

  tmp.len = 1;

  tmp.value = 2;

  }

  5、stuct初始化

  推荐一个我自己的C/C++交流群 815393859

  摘自4.4.2

  与数组一样,c++11也支持将列表初始化用于结构,且等号(=)是可选的.:

  opt tmp {1, 2};

  其中不允许缩窄转换,例如:

  opt tmp {1.0, 2};

  编译报错:

  error: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { }

  c语言可以使用列表初始化,但是等号(=)是必须的。

  opt tmp = {1,2};

  6、枚举的取值范围

  摘自4.6.2

  c++现在通过强制类型转换,增加了可以赋值给枚举变量的合法值。

  每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数赋值给枚举变量,即使这个值不是枚举值例如,假设bits 和myflag 的定义如下:

  enum bits{ one=1,two=2,four=4,eight=8};

  bits myflag;

  则下面的代码是合法的:

  myflag=bits(6);//正确,因为 6在bits的范围

  取值范围的定义:首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。

  例如对于:

  enum bigstep{first,second = 100,third};

  最大枚举值是101,在2的幂中,比这个值大的最小的值为128,因此取值范围上限为127.

  要知道下限,需要知道枚举量的最小值.如果它不小于0,则取值范围的下限为0.否则,采取与寻找上限方式同样的方式,但加上负号,

  例如,如果最小的枚举量为-6,则比它小的,2的幂最大的值为-8,加1之后为-7.于是,上限与下限便能算出来.

  c语言中不能定义这样的变量:bits myflag;

  7、for循环

  摘自5.1

  C++11新增一种循环:基于范围(range-based)的for循环:简化一种常见的循环任务:对数组(或容器类,如vector和array)的每个元素执行相同的操作.

  格式如下:

  for(Type VarName : Array){

  //每个元素的值会依次赋给 VarName

  }

  示例:

  double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};

  for (double x : prices)

  std::cout<<x<<std::endl;

  8、逻辑运算符的另一种表示

  摘自6.2.6

  并不是所有的键盘都提供了用作逻辑运算符的符号,标识符and、or和not都是c++保留字,这意味着不能将它们用作变量名等。它们不是关键字,因为它们都是已有语言特性的另一种表示方式。另外,它们并不是c语言中的保留字,但c语言程序可以将它们用作运算符,只要在程序中包含了头文件iso646.h.

  逻辑运算符:另一种表示方式

  运算符另一种表示方式&&and||or!not

  9、c++字符库函数cctype

  摘自6.3

  cctype中通常包括一些常用函数的判断,如某个字符是否为大写,用isupper()如果参数是大写字母,函数返回true, 还有像isalnum(),如果参数是字母数字,即字母或者数字,函数返回true.

  函数名称 返回值

  isalnum() 如果参数是字母数字,即字母或者数字,函数返回true

  isalpha() 如果参数是字母,函数返回true

  isblank() 如果参数是水平制表符或空格,函数返回true

  iscntrl() 如果参数是控制字符,函数返回true

  isdigit() 如果参数是数字(0-9),函数返回true

  isgraph() 如果参数是除空格之外的打印字符,函数返回true

  islower() 如果参数是小写字母,函数返回true

  isprint() 如果参数是打印字符(包括空格),函数返回true

  ispunct() 如果参数是标点符号,函数返回true

  isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true

  isupper() 如果参数是大写字母,函数返回true

  isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true

  tolower() 如果参数是大写字符,返回其小写,否则返回该参数

  toupper() 如果参数是小写字符,返回其大写,否则返回该参数

  10 、wchar_t 和C++11新增类型:char16_t char32_t

  摘自3.1.8

  wcha_t:

  wchar_t是C/C++的字符类型,是一种扩展的存储方式,主要用在国际化程序的实现中。

  wchar_t 存在的原因:

  char是八位字符类型,最多能包含256中字符,许多的外文字符集所包含的字符数目超过256个,char型不能表示。

  wchar_t数据大小:

  数据类型一般为16或者32位,不同的C/C++库有不同的规定。总之:wchar_t所能表示的字符远远多于char类型。

  wchar_t的输入输出处理:

  cin和cout将输入和输出看作是char流,因此不适合用于处理wchat类型,iostream头文件提供了wcin 和wcout用于处理输入输出流另外可以通过加上前缀L来只是宽字符常量和宽字符串。

  char16_t和char32_t:

  产生原因:

  随着编程人员日益的熟悉Unicode,类型wchar_t显然已经满足不了需求,在计算机系统上进行的编码字符和字符串编码时,仅仅使用Unicode码点显然是不够的,

  比如:如果在进行字符串编码时,如果有特定长度和符号特征的类型将很有帮助,而类型wchar_t的长度和符号特征随实现而已,因此C++11新增了类型char16_t,char32_t。

  char16_t:无符号类型,长16位,

  char32_t无符号类型,长32位

  C++11使用前缀u表示char16_t字符常量和字符串常量如:u‘L’;u“lilili”;

  C++11使用前缀U表示char32_t字符常量和字符串常量如:U'L';U"lilili";

  类型char16_t与/u00F6形式的通用字符名匹配,

  类型char32_t与/U0000222B形式的通用字符名匹配。

  前缀u和U分别指出字符字面值的类型为char16_t和char32_t。

  11、函数重载

  摘自8.4

  C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。

  void test(int tmp1, int tmp2)

  {

  std::cout << tmp1 <<std::endl;

  std::cout << tmp2 <<std::endl;

  }

  void test(double tmp1, double tmp2)

  {

  std::cout << tmp1 <<std::endl;

  std::cout << tmp2 <<std::endl;

  }

  函数的重载的规则:

  函数名称必须相同。

  参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。

  函数的返回类型可以相同也可以不相同。

  仅仅返回类型不同不足以成为函数的重载。

  C++ 是如何做到函数重载的

  C++代码在编译时会根据参数列表对函数进行重命名。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。

  在C语言中,不存在函数重载,原因为以函数名来唯一区分一个全局函数。而在c++中 以函数名+参数列表来唯一区分函数。

  12、引用

  摘自8.2

  引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。

  引用的特点:

  1. 一个变量可取多个别名。

  2. 引用必须初始化。

  3. 引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。

  总结:

  1. 不要返回一个临时变量的引用。

  2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

  * 引用和指针的区别和联系

  1. 指针是一个实体,而引用仅是个别名;

  2. 引用使用时无需解引用(*),指针需要解引用;

  3. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。

  4. 引用必须指向有效的变量,指针可以为空。

  5. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。

  6. 指针和引用自增(++)自减(--)意义不一样。


  7. 相对而言,引用比指针更安全。

  8. 从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

  * 相同点:两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。

  指针比引用更为灵活,但是其风险也很大。使用指针时一定要检查指针是否为空(NULL),且空间回收后指针最好置零,以免野指针的发生造成内存泄漏等问题。

  #include <iostream>

  int main()

  {

  struct student{

  std::string name;

  int num;

  };

  student lily = {"andrew", 168};

  const student &ref = lily;

  student *p = &lily;

  std::cout << sizeof ref<< "= sizeof ref ";

  std::cout << sizeof p<< "= sizeof pointer ";

  }

  执行结果:

  16= sizeof ref

  8= sizeof pointer

【C语言和C++的区别】相关文章:

C++、C语言和JAVA开发的区别06-28

浅谈c语言和c++和VB的区别07-04

C++、C语言和JAVA开发有哪些区别08-09

C语言和C++的分别06-18

Java与C/C++的区别06-18

C语言和C++有什么关系09-23

C/C++内存管理09-20

C++调用C函数的方法05-21

C++类的转换10-17

c++快速排序详解10-18