第2课 - C到C++的升级
1. C 与 C++ 的关系
(1)C++ 继承了所有的 C 特性
(2)C++ 在 C 的基础上提供了更多的语法和特性
(3)C++ 的设计目标是运行效率和与开发效率的统一
C→C++ 在很多方面得到了升级,为什么 C++ 只有两个加号呢?
因为 C++ 中的两个加号代表了 C→C++ 两个最重要的升级:① 类型的加强(对于类型的检查很严格) ② 支持面向对象
2. C到C++的升级
2.1 变量的定义
(1)C 语言中的变量都必须在作用域开始的位置定义。
(2)C++ 更强调语言的实用性,所有的变量都可以在需要使用时再定义。
这里 i 的作用域仅限于 for 循环内部。
2.2 register 关键字
(1)register 关键字请求编译器尽可能的将变量存放在 CPU 的寄存器中
① 在使用局部变量时,首先要把栈内存中的变量放到 CPU 的通用寄存器中,然后进行读写操作。对于读写频率很高的变量,这种方式会很低效。
② 早期的 C 语言编译器不会对代码进行优化,因此可以利用 register 关键字进行一个很好的补充。(register 只是请求,编译器不一定批准)
③ 在 C 语言中无法获取 register 变量的地址,因为 C 认为寄存器是没有地址的,地址这个概念针对的是内存。
(2)C++ 中的 register 关键字 (形同鸡肋)
① 随着编译器的发展,编译器本身会对代码进行优化,不再需要 register 关键字。
② 在 C++ 中依然支持 register 关键字,但只是为了兼容C。最新的 C++ 编译器中,register 关键字形同虚设,写了如同不写。
③ 在 C++ 中可以取得 register 变量的地址。C++ 编译器发现程序中需要取 register 变量的地址时,register 对变量的声明变的无效。
2.3 重命名全局变量名
(1)在 C 语言中,重复定义多个同名的全局变量是合法的。C 编译器将把多个同名的全局变量最终链接到全局数据区的同一个地址空间上。
(2)在 C++ 中,不允许定义多个同名的全局变量。因为这是一种有二义性的做法,会被 C++ 直接拒绝!
1 // 验证前面三条C → C++ 的升级 2 3 #include <stdio.h> 4 5 int g_v; // 同名的全局变量 6 //int g_v; 7 8 int main(int argc, char *argv[]) 9 { 10 printf("Begin... "); 11 12 int c = 0; 13 14 for(int i=1; i<=3; i++) // 变量使用时定义 15 { 16 for(int j=1; j<=3; j++) 17 { 18 c += i * j; 19 } 20 } 21 22 printf("c = %d ", c); 23 24 register int a = 0; // register关键字 25 26 printf("&a = %p ", &a); 27 28 printf("End... "); 29 30 return 0; 31 }
2.4 struct 关键字的加强
(1) C语言中的 struct 定义了一组变量的集合,其定义的标识符并不是一种新的数据类型。
(2)C++ 中的 struct 用于定义一种全新的类型。
2.5 标识符的类型
(1)C++ 中所有的标识符都必须显示的声明类型( C++ 中加强了类型的概念,必须明确指出)
(2)C 语言中的默认类型(int型)在 C++ 中是不合法的
(3)在 C 和 C++ 中无参与 void 参数的区别
C 语言 | C++ 语言 | |
int func() | 返回值为 int,接受任意参数 | 返回值为int,不接受参数 |
int func(void) | 返回值为 int,不接受参数 | |
func() | 返回值为 int,接受任意参数 | 非法 |
func(void) | 返回值为 int,不接受参数 | |
func(i) | 返回值为 int,等价于 int func(int i) |
1 // 验证第4条和第5条升级点 2 3 #include <stdio.h> 4 5 struct Student // 在C++中直接定义了一个新的数据类型,但在C语言要用typedef来重命名 6 { 7 const char* name; 8 int age; 9 }; 10 11 f(i) // 在C++中这种写法是错误的,不允许默认类型的返回值 12 { 13 printf("i = %d ", i); 14 } 15 16 g() 17 { 18 return 5; 19 } 20 21 22 int main(int argc, char *argv[]) 23 { 24 Student s1 = {"Delphi", 30}; 25 Student s2 = {"Tang", 30}; 26 27 f(10); 28 29 printf("g() = %d ", g(1,2,3,4,5)); // C中是传入任意参数,C++中是错误的 30 31 return 0; 32 }
3. 小结
(1)C++ 更强调实用性,可以在任意的地方声明变量
(2)C++ 中的 register 只是一个兼容的作用
(3)C++ 编译器能够更好的进行优化
(4)C++ 中的任意标识符都必须显示的指明类型
注:本文总结于狄泰唐老师的《C++深度解析》课程
狄泰QQ群:199546072
本人QQ号:502218614