C++解析(1):C到C++的升级
0.目录
1.C与C++的关系
2.C到C++的升级
- 2.1 语言的实用性
- 2.2 register关键字
- 2.3 同名的全局变量
- 2.4 struct关键字
- 2.5 int f() 与 int f(void) 有区别吗?
3.小结
1.C与C++的关系
- C++继承了所有的C特性
- C++在C的基础上提供了更多的语法和特性
- C++的设计目标是运行效率与开发效率的统一
2.C到C++的升级
2.1 语言的实用性
C++更强调语言的实用性
C++中所有的变量都可以在需要使用时再定义
而C语言中的变量都必须在作用域开始的位置定义!!
(早期的C89/90标准确实是这样的规定,但是后来的C99标准允许随用随定义,目前大部分编译器都已支持C99标准,但仍有少量编译器没有支持。)
2.2 register关键字
register关键字请求编译器将局部变量存储于寄存器中,在C++中依然支持register关键字
(如果register请求通过的话,那么变量就放在寄存器里面,从而效率就提高了。
register关键字仅仅是一个请求编译器做某事,因此的话编译器完全可以拒绝。
所以一直以来,register在C语言中的地位,虽然对于提高效率来说看上去很重要,但其实很鸡肋。因为编译器发展到后期之后,编译器本身就会做优化了,也许你不写register关键字,编译器仍然会将一个变量存储于寄存器当中。
所以说C语言里面的register关键字就显得在工程开发中比较鸡肋。于是通过这种工程经验,C++里面虽然依旧支持register,但仅仅是为了兼容C语言。)
C++编译器有自己的优化方式:
- C语言中无法获取register变量的地址
- C++中可以取得register变量的地址
C++中的register关键字:
- C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
- 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
2.3 同名的全局变量
- 在C语言中,重复定义多个同名的全局变量是合法的
- 在C++中,不允许定义多个同名的全局变量
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。(C++直接拒绝这种二义性的做法!)
2.4 struct关键字
- C语言中的struct定义了一组变量的集合
- C语言中struct定义的标识符并不是一种新的类型
- C++中的struct用于定义一个全新的类型
(如果在C语言里面需要将struct定义的这个集合当成一种类型来使用的话,那就必须要通过typedef关键字来重命名一下,这是C语言里的做法。
然而在C++中,有一个重大的改进,就是类型的加强,也就是说,C++里面非常注重类型,在C++里面,就把struct关键字当成一个定义新类型的关键字,只要struct出现了,C++编译器就会认为这里产生了一个全新的类型,因此C和C++中结构体的定义在写法上是等价的。
在C++看来,struct就定义了一个名为Student的新类型,但是C语言看来,这里只是定义了一个变量的集合,并且这个变量的集合有一个名字,叫做_tag_student,它并不是一种新类型。如果非要当成一种新类型来使用,就必须通过typedef给它一个类型名。
C++这样做有什么好处:更清晰,可读性更好。)
也就是说:
2.5 int f() 与 int f(void) 有区别吗?
面试中的小问题,int f() 与 int f(void) 有区别吗?如果有区别是什么?
在C语言中:
- int f() 表示返回值为 int,接受任意参数的函数
- f(void) 表示返回值为 int 的无参函数
在C++中:
- int f() 和 int f(void) 具有相同的意义
- 都表示返回值为 int 的无参函数
总结:
- C++中所有的标识符都必须显示的声明类型
- C语言中的默认类型在C++中是不合法的
3.小结
- C++更强调实用性,可以在任意的地方声明变量
- C++中的register只是一个兼容的作用
- C++编译器能够更好的进行优化
- C++中的任意标识符都必须显示的指明类型