1 C 和 C++ 的关系
- C++ 继承了所有的 C 特性
- C++ 在 C 的基础上提供了更多的语法和特性
- C++ 的设计目标是运行效率和开发效率的统一
2 C 到 C++ 的升级
1、C++ 中所有的变量都可以在使用时再定义
对比:C 语言中的变量都必须在作用域开始的位置定义!!
int c = 0;
for(int i = 0; i <= 3; i++)
{
for(int j = 1; j <= 3; j++)
{
c += i * j;
}
}
经过尝试,用 C++ 编译器都可以编译运行,gcc 7.4.0可以编译运行,gcc 4.4.5 有编译错误,表明变量 i,j 应该在作用域开始的位置定义。
2、register 关键字变化
register 关键字请求编译器将局部变量存储于寄存器中。
寄存器的运行速度大于内存,所以将变量存储在寄存器上可以加快运行速度,register 在 C 语言中只是向编译器请求,不保证一定成功。C++ 现代编译器经过优化,就算没有 register 也可能将变量存储在寄存器上,所以在 C++ 中 register 关键字就鸡肋,完全是为了兼容 C 语言。
不同:
- C 语言中无法获取register变量的地址
- C++ 中可以获得register变量的地址
由于寄存器不是内存,所以 C 语言中无法获取寄存器的内存地址。
3、全局变量
- 在 C 语言中,重复定义多个同名的全局变量是合法的(最终被链接到全局数据区的同一个地址空间)
- 在 C++ 中,不允许定义多个同名的全局变量
实例分析:
// 2-1.c
#include<stdio.h>
int g_var;
// int g_var;
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = 0;
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
c += i * j;
}
}
printf("c = %d\n", c);
register int a = 0;
printf("&a = %p\n", &a);
printf("End...\n");
return 0;
}
- 第 3,4 行全局变量,C++ 不能重复定义
- i 和 j 在 for 循环使用时定义,C++编译器支持
- 第 17,18 行,C++可以对 register 变量取地址
编译运行:
$ g++ 2-1.c -o 2-1
$ ./2-1
Begin...
c = 36
&a = 0x7ffc99eff858
End...
4、struct 关键字加强
- C 语言中的 struct 定义了一组变量的集合,struct 定义的标示符并不是一种新的类型
- C++ 中的 struct 用于定义一个全新的类型
5、c++中所有的变量和函数都必须有类型
- C++ 中所有的标示符都必须显示的声明类型
- C 语言中的默认类型在 C++中是不合法的
看下面的程序:
问题:
1、函数 f 的返回值和参数分别是什么类型?
2、函数 g 可以接受多少个参数
在 C 语言中
- int f() 表示返回值为 int,接受任意参数的函数
- f(void) 表示返回值为 int 的无参函数
在 C++ 中
- int f() 和 int f(void) 具有相同的意义,表示返回值为 int 的无参数类型
实例分析:
// 2-2.c
#include<stdio.h>
typedef struct _tag_student Student;
struct _tag_student
{
const char* name;
int age;
};
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main()
{
Student s1 = {"Sun", 30};
Student s2 = {"Sang", 30};
f(10);
printf("g() = %d\n", g(1,2,3,4,5));
return 0;
}
上述代码用 C 语言编译器编译:
- 第 3 行用typedef 将 struct _tag_student 取别名为 Student,不能用 Student 做结构体名称后直接定义 Student s1,因为 C 语言结构体表示变量集合,不是新数据类型
- 第 9 行,函数 f(i) 默认参数为 int(可以不只一个参数),返回值为 int
- 第 13 行,函数 g() 表示返回值为 int,接受任意参数的函数
编译运行:
$ gcc 2-2.c -o 2-2
2-2.c:9:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
f(i)
^
2-2.c: In function ‘f’:
2-2.c:9:1: warning: type of ‘i’ defaults to ‘int’ [-Wimplicit-int]
2-2.c: At top level:
2-2.c:13:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
g()
^
$ ./2-2
i = 10
g() = 5
编译器警告函数参数,返回类型默认为 int
当用 C++ 编译器编译时, struct 定义一个全新的类型,不用 typedef 重命名了,所有的标示符都必须显示的声明类型
3 小结
1、C++ 更强调使用,可以在任何地方声明变量
2、C++中的 register 只是一个兼容作用,C++ 编译器能更好的优化
3、C++ 中所有的标示符都必须显示的指明类型