C++继承了所有C的特性。C++在C的基础上提供了更多的语法和特性。C++的设计目标是运行效率和开发效率的统一。
变量
C++更强调语言的实用性。
C++中所有的变量都可以在需要使用时再定义。
int c = 0;
for (int i = 1; i <= 3; i++) { //在循环中定义变量,是C++的语法,旧式C编译器不支持,但新式C99标准支持
for (int j = 1; j <= 3; j++) {
c += i * j;
}
}
对比:
C语言中的变量都必须在作用域开始的位置定义。
register关键字
register关键字请求编译器将局部变量存储于寄存器中:
- 在C++中依然支持register关键字
- C++编译器有自己的优化方式
- C语言中无法获取register变量的地址
- C++中可以取得register变量的地址
- C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
- 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充
重复定义全局变量
在C语言中,重复定义多个同名的全局变量是合法的。
- C语言中,多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
在C++中,不允许定义多个同名的全局变量,C++直接拒绝这种二义性的做法。
示例:C到C++的升级一
#include <stdio.h>
int g_v;
//int g_v; // 重复定义全局变量会编译错误
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = 0;
for(int i=1; i<=3; i++) // C++中合法
{
for(int j=1; j<=3; j++)
{
c += i * j;
}
}
printf("c = %d\n", c);
register int a = 0;
printf("&a = %p\n", &a); // register关键字会失效
printf("End...\n");
return 0;
}
输出结果:
struct关键字
Struct关键字的加强
- C语言中struct定义了一组变量的集合
- C语言中struct定义的标识符并不是一种新的类型
- C++中的struct用于定义一个全新的类型
无参函数和默认返回类型
思考:
int f()
与int f(void)
有区别吗? 如果有,区别是什么?
- 如果是C语言编译器,是合法的,可以同时存在
- 如果是C++编译器,两种写法无区别,不能同时存在
C++中所有的标识符都必须显示声明类型。
C语言中的默认类型在C++中是不合法的。
看下面一个例子:
f(i) {
printf("i = %d\n", i);
}
g() {
return 5;
}
问题:
- 函数f的返回值和参数分别是什么类型?
- 函数g可以接受多少个参数?
在C语言中:
int f()
表示返回值为int,接受任意参数的函数f(void)
表示返回值为int的无参函数
在C++中:
int f()和int f(void)
具有相同的意义:表示返回值为int的无参函数
示例:C到C++的升级二
#include <stdio.h>
struct Student
{
const char* name;
int age;
};
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char *argv[])
{
Student s1 = {"deepinout.com", 30};
Student s2 = {"www.deepinout.com", 30};
f(10);
printf("g() = %d\n", g(1,2,3,4,5));
return 0;
}
g++编译结果:
gcc编译结果:
总结
- C++更强调实用性,可以在任意的地方声明变量
- C++中的register只是一个兼容的作用
- C++编译器能够更好地进行优化
- C++中的任意标识符都必须显示地指明类型