- 论坛徽章:
- 0
|
C、C++的区别与联系
aqiaoboy
一 引言
本文旨在说明C与C++语言的一些基本区别和联系,为C程序和C++程序之间的移植做些简单清晰的帮助。
此文一般不涉及C到C++的设计思想上的转变。
本文主要内容来自C++编程思想一书。
二 区别
1 早联编与晚联编
非OOP编译器通常采用早联编,编译器对特定的函数名产生调用,而连接器确定调用可执行函数的决定地址。在程序运行前,编译器已经确定了执行代码的地址。
OOP编译器则采用晚联编,编译器只是保证这个调用函数存在,编译器在真正调用的地方插入一段特殊的二进制代码,通过使用存放在对象中的信息,这段代码在程序时才计算被调用函数的地址。
2 C++中必须先说明函数才能够调用 ,使编译器能够检查他们的使用情况。
C中函数声明时,参数名可给也可不不给出,但定义时参数必须。
但C++中定义时参数不一定要给出。
3 C++存在引用,他允许对函数参数和返回值的地址进行更方便的处理。
4 C++存在命名空间概念,加强了对名字的控制,有效防止了名字冲突。
C对于函数使用单个名字空间,所以当连接器找一个函数名,只在一个单独的主表中寻找。在C中如果同时引用两个第三方的库,函数名可能冲突,标准C规定应该给出一个出错。但有的编译器只是寻找第一个找到的函数名,很可能造成不可预料的后果。
5 C与C++程序的速度大概在+-10%之内。
6 C++中的非成员函数必须定义返回值,没有显式返回值的声明或定义将编译出错。
但类中的构造函数又不能指定返回类型,甚至不能返回void。见C++ PRIMER
此处需要实验证明!
C中如果不定义返回值,缺省为int类型
7 C++ 中int fork() 等价int fork(void)
C中不支持前者。
8 C++允许在局部程序块中使用变量前的任意位置定义变量,
C要求一律在局部程序块开始的位置定义变量。
9 在C中不允许直接FOR表达式中直接定义循环变量,C++是允许的。
for(int j = 0; j < 100; j++) {
cout << "j = " << j << endl;
}
而且在标准C++中,上面的j在for循环结束后立即无效。
10 用const代替define,因为const提供类型检查
11 C++中对枚举进行严格的类型检查,如果你定义了一个枚举变量为a,在C中你可以a++,但C++中不可以。
12 C中不能用const作为数组下标,C++中可以,因为C++编译器通常把const常量放到符号表里面,不分配存储空间。
13在C++中不允许这样使用
const int bufsize
因为C++中缺省为内部连接,也就是仅本文件内可见,你必须在定义时就给它赋值,除非你显式地声明一个外部变量
extern const int bufsize;
在C中const缺省为外部连接,也就是说
const int bufsize;
在C中就等于
extern const int bufsize; |
|