C++与C的区别

来源:互联网 发布:oracle数据库中rownum 编辑:程序博客网 时间:2024/05/16 05:14

C++与C的区别
来源:IIEEG02-23-2011
  1) 函数声明

  l C如果不写返回值,默认是int,而C++中不能不写返回值(可用void表示无返回值)。

  如Func1();

  l int Func1()在C中表示可带任意参数的函数,这是C的漏洞,使得它避开了参数类型检查;而C++中表示不带参数的函数。

  2) 头文件的区别

  l C++的头文件去掉了C中的.h,以c前缀开始。比如, 变为

  l C带.h的是非模板化的头文件,而C++是模板化的头文件。

  .h文件是不含命名空间的,所以以前的是不需要using的。

  当然也可以用老的C头文件,但是,在同一个程序里不能混着用,虽然编译可以通过,但是可能会出现问题。

  3) register变量

  在C语言中,是不能对register变量取地址的,因为它没有虚地址,在寄存器里。而C++中,它是可以取址的,这时,C++编译器会忽略register,不会把它放到寄存器里。

  4) const变量

  在C语言中,const是只读的变量,不是常量;C++中它是常量。

  区别用例子描述如下:

  const int MAX = 10;

  char buffer[MAX]; //C中它是不合法的,可以用enum或

  define替代;

  //C++中它是合法的。

  本质:C语言中const变量分配在全局静态区,默认是外部链接;C++中则在常量区,编译过程中值就定了,默认是内部链接,用extern可改为外部链接。

  const int a; //在C里是合法的,在C++里必须赋初值,因为C++里是编译期间就需要它的值了,而C里是保存在内存里而不是符号表里。

  5) typedef

  在C语言中,

  struct A

  {

  };

  A a; //这是错误的,在C++中是合法的。

  struct A a; //这是正确的

  用了typedef后,C中A a;也是合法的了。

  6) struct/union/class

  l 对于struct/union数据成员与函数成员的访问性来说,其默认是public;

  l class则是private。

  l union联合体不能作为基类继承。

  union A

  {

  };

  class B: public A //编译出错

  {

  };

  l 匿名union

  union

  {

  int a;

  float b;

  };

  在程序里可以直接访问 a、b。所以,如果匿名union定义为全局的,注意使得它为内部链接的,否则很容易跟外面的变量起冲突。

  定义为static即可为内部链接。

  关于内部链接,请参考

  http://blog.csdn.net/yeming81/archive/2010/05/31/5637704.aspx

  7) 小作用域

  在C语言中,如下写法是会出编译错误的:

  for( int i = 0; i < 10; i++)

  {

  }

  8) C语言没有函数重载

  关于C++的函数重载,请参考

  http://blog.csdn.net/yeming81/archive/2010/05/31/5637736.aspx

  9) 类型安全链接

  在C语言中,

  a.cpp

  void Func1( int ) { }

  b.cpp

  void Func1( char );

  int main()

  {

  Func1( 1 ); //C语言中是没有错误的,但C++不行。

  }

  因为C++是类型安全链接的,对于Func1来说,它是内部链接的,它看不见a.cpp中定义的函数,它调用Func1_char函数,但是找不到实现。

  可见:可以利用C++编译器去编译C语言程序,找出潜在的错误。

  10) C++有异常机制,而C没有。

  关于异常,请参考

  http://blog.csdn.net/yeming81/archive/2010/06/16/5673070.aspx

原创粉丝点击