C到C++的升级
1,C 与 C++ 的关系:
1,C++ 继承了所有 C 的特性;
2,C++ 在 C 的基础上提供了更多的语法和特性,天生就有面向对象的思想;
3,C++ 的设计目标是运行效率与开发效率的统一;
1,运行效率和开发效率非常高;
2,C++ 更强调语言的实用性,
1,所有的变量都可以在需要使用时再定义,在任意位置定义,C语言不是这样,C语言的变量必须在作用域开始的位置进行定义:
1 int c = 0;
2
3 for(int i=1; i<=3; i++) // 使用时定义;
4 {
5 for(int j=1; j<=3; j++)
6 {
7 c += i * j;
8 }
9 }
2,C 语言中的变量都必须在作用域开始的位置定义;
1,比如 main() 函数最开始的地方,否则报错;
3,register 关键字请求编译器将局部变量存储于寄存器中**(可有可无的鸡肋)**:
1,在 C++ 中依然支持 register 关键字;
2,C++ 编译器有自己的优化方式;
1,C 语言中无法获取 register 变量的地址;
2,C++ 中可以获取 register 变量的地址;
3,C++ 编译器基本不关心 register 是否存在,有自己的优化方式。依旧支持只是为了兼容C语言。
1,C++ 编译器发现程序中需要取 register 变量的地址时,register 对变量的声明变的无效,早期的C++编译器的做法;
2,早期 C 语言编译器不会对代码进行优化,因此 register 变量是一个很好的补充;
4,在 C 语言中,重复定义多个同名的全局变量是合法的,但是在 C++ 中不允许定 义多个同名的全局变量:
1,C 语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上;
2,C++ 直接拒绝这种**二义性**的做法;
5,实例分析:C 到 C++ 的升级一
1,main() 函数:
1 #include <stdio.h>
2
3 int g_v;
4 //int g_v; // C++ 中不允许定义多个同名全局变量;
5
6 int main(int argc, char *argv[])
7 {
8 printf("Begin...\n");
9
10 int c = 0; // C 中必须在作用域开始的地方;
11
12 for(int i=1; i<=3; i++) // 使用时定义;
13 {
14 for(int j=1; j<=3; j++)
15 {
16 c += i * j;
17 }
18 }
19
20 printf("c = %d\n", c);
21
22 register int a = 0; // 新版本 C++ 编译器直接忽略;
23
24 printf("&a = %p\n", &a); // 旧版本 C++ 编译器中在这里会忽略 register 关键字;
25
26 printf("End...\n");
27
28 return 0;
29 }
6,struct 关键字的加强:
1,C 语言中的 struct 定义了一组变量的集合;
1,并不是真正的类型;
2,C 语言中 struct 定义的标识符并不是一种新的类型,只定义了一个变量的集合,如果要把它变为类型,那就用typedef来转化为类型;
1,可以通过 typedef 重命名,当做一个类型来使用,但是 C 编译器不认为这是个类型;
3,C++ 中的 struct 用于定义一个全新的类型,产生了一个新类型;
1,类型加强;
7,int f() 与 int f(void) 有什么区别:
1,C++ 中所有的标识符都必须显示的声明类型;
2,C 语言中的默认类型在 C++ 中是不合法的;
1 f(i) // C有默认类型,c 中函数定义时没有给出参数或返回值类型,则默认为 int 类型,则 f() 返回值为 int,参数 i 类型为 int;
2 {
3 printf("i = %d\n", i);
4 }
5
6 g() // g() 返回值为 int,参数为任意类型;
7 {
8 return 0;
9 }
3,在 C 语言中:
1,int f() 表示返回值为 int,接受任意参数的函数;
1,参数个数和类型任意;
2,int f(void) 表示返回值为 int 的无参函数,不接受任何参数,可省略 int 写为f(void);
1,默认参数类型;
2,void 表示不接受任何参数;
1,有二义性,不利于维护,现在很少利用;
4,在 C++ 中:
1,int f() 和 int f(void) 具有相同的意义:
1,表示返回值为 int 的无参函数;
2,int f(void) 只是为了兼容 C 语言;
3,C++ 中对类型检查非常严格,不允许有默认类型发生,不允许有不写返回值的类型的出现;
5,答案:
1,它们是否有区别,要看用什么编译器,如果用 C 语言编译器,这两种写法有区别;
2,如果是 C 语言编译器,前面一种写法是返回值为 int,参数任意多,后一种写法是返回值为 int,不接受任何参数;
3,如果是 C++ 编译器,两种写法没有区别;
8,实例分析:C 到 C++ 的升级二
1,main.cpp 文件:
1 #include <stdio.h>
2
3 struct Student
4 {
5 const char* name;
6 int age;
7 };
8
9 f(i) // C++ 中错误;
10 {
11 printf("i = %d\n", i);
12 }
13
14 g() // C++ 中错误;
15 {
16 return 5;
17 }
18
19 int main(int argc, char *argv[])
20 {
21 Student s1 = {"Delphi", 30};
22 Student s2 = {"Tang", 30};
23
24 f(10); // C 中打印:10;
25
26 printf("g() = %d\n", g(1,2,3,4,5)); // C 中打印:5;
27
28 return 0;
29 }
9,小结:
1,C++ 更强调实用性,可以在任意的地方声明变量;
2,C++ 中的 register 只是一个兼容的作用;
3,C++ 编译器能够进行更好的优化;
4,C++ 中的 struct 定义了全新的类型;
5,C++ 中的任意标识符都必须显示的指明类型;
1,**不允许默认类型发生**;