第2课 C 到 C++ 的升级
1. C与C++的关系
(1)C++继承了所有的C特性,并在C的基础上提供了更多的语法和特性。
(2)C++的设计目标是运行效率与开发效率的统一,它更强调的是语言的实用性。
2. C到C++ 的升级
2.1 变量的定义
① C++中所有的变量都可以在需要使用时再定义(C++更强调语言的实用性)
② C语言中的变量都必须在作用域开始位置定义
2.2 register关键字
(1)register关键字请求编译器将局部变量存储于寄存器中
①C++中依然支持register关键字,但这只是为了兼容C
②C++编译器有自己的优化方式
-
-
在C语言中无法获取register变量的地址,因为C认为寄存器是没有地址的。
-
在C++中可以取得register变量的地址。
-
(2)C++中的register关键字
①C++编译器发现程序中需要取变量地址时,register对变量的声明变得无效。所以C++将无视这个关键字,直接将其register的变量放入内存(注意,不是寄存器)。
②早期C语言编译器不会对代码进行优化。因此可以利用register变量来进行一个很好补充。但C++认为寄存器非常宝贵,这个register关键字并不被推荐使用,它只是为了兼容C而存在。
2.3 重命名全局变量名
(1)在C语言中,重复定义多个同名的全局变量是合法的。C编译器将把多个同名的全局变量最终链接到全局数据区的同一个地址空间上。
(2)在C++中,不允许定义多个同名的全局变量。因为这是一种有二义性的做法,会被C++直接拒绝!
【实例分析】C到C++的升级一 2-1.cpp
#include <stdio.h> int g_v; //ing g_v; //重复定义全局变量,C是合法的,会映射到同一个地址 //但C++是非法的 int main() { printf("Begin...\n"); int c = 0; //C++中变量可以随时定义,而不必像C那样必须在作用域 //开始的位置 for (int i=1; i<=3;i++) //在for循环内定义变量i和j { for(int j=1; j<=3; j++) { c += i * j; } } printf("c = %d\n", c); register int a = 0; //register变量 printf("&a = %p\n", &a); //对a取地址,C++会将a放到内存而不是寄存器 //但在C语言中&a是非法的。 printf("End...\n"); return 0; }
运行结果:
2.4 struct关键字的加强
(1)C语言中的struct定义了一组变量的集合,其定义的标识符并不是一种新的类型。
(2)C++中的struct用于定义一种全新的类型
2.5 标识符的类型
(1)C++中所有的标识符都必须显式的声明类型。
(2)C语言中的默认类型(int型)在C++中是不合法的。(C++的返回值与C语言一样,可以不必声明类型,默认仍为int)
(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) |
非法 |
【实例分析】C到C++的升级二 2-2.cpp
#include <stdio.h> //在C++中Student是一种新的类型,但在C语言要用typedef来重命名 struct Student { const char* name; int age; }; //C语言中下列是合法的,等价于int f(int i); //但C++所有的标识符须定义类型,不认识i的类型,会报错 //f(i) //{ // printf("i = %d\n", i); //} //C语言中下列是合法的,表示返回值int,接受任意参数 //但C++表示返回值int的无参数,相于当int g(void) g() { return 5; } int main() { Student s1 = {"Hello", 30}; Student s2 = {"World", 20}; //f(10);//C合法,C++会报错 printf("g() = %d\n",g(1,2,3,4,5));//C合法,C++中不能为g传入参数 return 0; }
C++编译报错:
3. 小结
(1)C++更强调实用性,可以在任意的地方声明变量
(2)C++中的register只是一个兼容的作用
(3)C++编译器能够更好的进行优化
(4)C++中的任意标识符都必须显示的指明类型