概述:
C++是在C语言的基础上发展而来,但他们两并不是竞争关系。C++继承了C语言的很多特性,同时也对某些特性进行了加强,以下进行逐一讲解。
- 变量检测更加严格
在C语言中重复定义多个同名全局变量,编译器可以正常编译,属于合法行为,最终会被连接到全局数据区的同一个地址上。如:
int g_var;
int g_var=0;
C编译器对以上代码不会报错。
而在C++中编译器是不会语言同名重复的变量,直接避免了这种二义性的产生。
- register
register的意思是告诉编译器直接把register修饰的局部变量放到寄存器中,好处是提高速度。
运行代码:
int main(){
register int var = 0;
Printf(“&var:”, &var);
return 0;
}
在C编译器中你会发现以上代码编译出错,并指出register修饰的变量不能取地址。但如果在C++编译中编译,则可以正常编译通道,打印对应地址。说明C++对该修饰符进行了优化。
- const
用const修饰的变量代表只读,const修饰的位置不同产品不同的功能,如:
Const int a; //值不可变
int const b; // 同上
const int *c; // 值不可变
int* const d; // 对应的地址不可变
const int* const e; // 值和地址都不可变
有以上认识之后,开始思考以下代码:
int main(){
const int var=0;
int* p=(int *)&var;
*p = 10;
prinf(“var=%d, *p=%d\n”, var, *p);
}
C编译器:
运行结果是var=10,*p=10;证明const修饰的var也可以间接进行修改,可见在C中const修饰的变量并没有真正实现const功能,只是防止直接修改,但无法防止间接修改,可以说在C中const是一个“假的const”。
C++编译器:
同样可以编译通道,但是运行结果是var=0,*p=10;可见在C++中const修改的变量防止了间接修改的漏洞。那它是怎么实现的呢?可能是C++在定义const变量时,如a=0,编译器给a分配了地址,在符号表里存放常量值0,*p只是修改地址上的值,并没有改变符号表里的常量0;
- struct
C编译器并不认为struct定义的结构是一种新的类型,只是认为是一组变量的集合,而在C++中struct被定义为一种新的类型,同时可实现类的大部分功能。
- 对函数和变量检测加强
func_a(i){
printf(“i=%d\n”, i);
}
func_b(){
return 0;
}
int main(){
func_a(100);
func_b(1,2,3,4);
return 0;
}
以上代码很怪,要么没有形参类型,要么直接没有形参,同时也没有返回类型。可是在C编译器编译你会发现可以正确编译成功。但在C++编译器中就会编译失败,证明C++编译器对以上情况的检测进行了加强。
- 三目运算符
int main(){
int a = 5;
int b = 10;
(a < b ? a : b )= 20;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
相信做C开发的人看到以上代码就会知道有什么结果出现;没错,在C编译器中编译以上代码会报错,因为在C中三目运算符返回的是编译对应的值,而常量值是不能当左值使用的。
但同样的代码放到C++编译器上编译,则可以成功编译,并可以正确运行,因为在C++编译器中三目运算符返回的是值的地址,因此可以当左值使用。
思考:
在C中怎么才可能实现C++的效果呢?
答案是:*(a < b ? &a : &b) = 20
以上是对C++在C的基础增强功能的总结,但不限于以上提到内容。大家可以自行挖掘。