1) 函数声明
l C如果不写返回值,默认是int,而C++中不能不写返回值(可用void表示无返回值)。
如Func1();
l int Func1()在C中表示可带任意参数的函数,这是C的漏洞,使得它避开了参数类型检查;而C++中表示不带参数的函数。
2) 头文件的区别
l C++的头文件去掉了C中的.h,以c前缀开始。比如,<stdio.h> <stdlib.h>变为<cstdio> <cstdlib>
l C带.h的是非模板化的头文件,而C++是模板化的头文件。
.h文件是不含命名空间的,所以以前的<iostream.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