C到C++的升级:
那么到底在哪些地方做了升级呢?
1.所有变量都可以在使用的时候进行定义,这个是C所不允许的;
C语言规定所有变量都必须在作用域开始进行定义.
例如:
这行代码在C++中是推荐使用的,但是在C中绝对不行.
可以上机测试..
2.register关键字的变化
在c语言中,如果我们使用register修饰变量,那么编译器将会为该变量分配一个寄存器地址,注意了这里
不是分配内存地址,至于分配寄存器地址的作用,这属于C知识的范畴,暂不做讨论.
重点分析的就是关于在C++中使用register的时候需要注意的地方
例如:
我们知道在C中这两行代码是不允许的,一定会报错,取址符取的地址是内存的地址,所以如果取寄存器的
地址的话肯定会报错的.
但是,但是.如果上面两行代码放到C++中去的话,是不会有问题的,这就是C++加强的地方,并不意味着C++
里面会取址,而是说C++编译的时候遇到取址符的时候会自动给i分配一个内存空间,而不是寄存器地址空
间,这也是C++优化的一部分.
3.C和C++中多个重名变量定义的问题
例如:
我们知道在C中上面的代码编译器是不会报错的,结果是否正确另当别论,但是,当我们把这几行代码放到
C++中去的时候,编译器会毫不客气的抛出错误,这就是C++拒绝这种重义性的变量定义方法.正确与否试试
便知.
4.const修饰符的增强
首先我们有个称法就是在C中是const变量,但是在C++中却是称作const常量,真正意义上的常量.
例如
上面输出值分别是什么呢? 可以上机测试.
稍作解释:
a.在C++中const修饰的才是真正意义上的常量,编译器会在符号表中记录i这个变量,当你下次使用到c的时
候,他会自动在符号表中取这个值,二而不管你的变量内存值是否改变.
b.如果编译器遇到对const常量使用了extern或者&操作符,那么则会给对应的常量分配空间.
然后,关于const常量和宏定义的区别
const常量是由编译器处理的,提供类型检查和作用域检查;
宏定义是由预处理器处理的,只做单纯的文本替换.
5.struct类型的加强
C语言中对struct并不认为是一种新的类型,C语言中也不可能产生新的类型
但是在C++中,struct会被解析成一种新的类型.
6.类型
C++中所有变量和函数都 "必须" 有类型
C语言中默认的类型是int,可以缺省.
可以看出C++更强调类型,所有元素以及函数返回值都必须显示的指明类型.
那么到底在哪些地方做了升级呢?
1.所有变量都可以在使用的时候进行定义,这个是C所不允许的;
C语言规定所有变量都必须在作用域开始进行定义.
例如:
for(int i = 0; i < 10; i ++)
{
for(int j = 0; j < 5; j ++)
{
}
}
这行代码在C++中是推荐使用的,但是在C中绝对不行.
可以上机测试..
2.register关键字的变化
在c语言中,如果我们使用register修饰变量,那么编译器将会为该变量分配一个寄存器地址,注意了这里
不是分配内存地址,至于分配寄存器地址的作用,这属于C知识的范畴,暂不做讨论.
重点分析的就是关于在C++中使用register的时候需要注意的地方
例如:
register int i = 10;
printf("the address of i is %p",&i);
我们知道在C中这两行代码是不允许的,一定会报错,取址符取的地址是内存的地址,所以如果取寄存器的
地址的话肯定会报错的.
但是,但是.如果上面两行代码放到C++中去的话,是不会有问题的,这就是C++加强的地方,并不意味着C++
里面会取址,而是说C++编译的时候遇到取址符的时候会自动给i分配一个内存空间,而不是寄存器地址空
间,这也是C++优化的一部分.
3.C和C++中多个重名变量定义的问题
例如:
int a;
int a = 10;
int main()
{
}
我们知道在C中上面的代码编译器是不会报错的,结果是否正确另当别论,但是,当我们把这几行代码放到
C++中去的时候,编译器会毫不客气的抛出错误,这就是C++拒绝这种重义性的变量定义方法.正确与否试试
便知.
4.const修饰符的增强
首先我们有个称法就是在C中是const变量,但是在C++中却是称作const常量,真正意义上的常量.
例如
const int i = 0;
int *p = &i;
*p = 5;
printf("*p = %d \n", *p);
printf("i = %d \n", c);
上面输出值分别是什么呢? 可以上机测试.
稍作解释:
a.在C++中const修饰的才是真正意义上的常量,编译器会在符号表中记录i这个变量,当你下次使用到c的时
候,他会自动在符号表中取这个值,二而不管你的变量内存值是否改变.
b.如果编译器遇到对const常量使用了extern或者&操作符,那么则会给对应的常量分配空间.
然后,关于const常量和宏定义的区别
const常量是由编译器处理的,提供类型检查和作用域检查;
宏定义是由预处理器处理的,只做单纯的文本替换.
5.struct类型的加强
C语言中对struct并不认为是一种新的类型,C语言中也不可能产生新的类型
但是在C++中,struct会被解析成一种新的类型.
6.类型
C++中所有变量和函数都 "必须" 有类型
C语言中默认的类型是int,可以缺省.
可以看出C++更强调类型,所有元素以及函数返回值都必须显示的指明类型.