一、变量定义的升级
C++中所有变量均可以在使用的时候再定义;
C语言中,所有变量必须先定义再使用(在作用域开始的位置定义)。
例如:
for(int i = 0;i < 10; i ++)
{
printf("%d\r\n",i);
}
在C++这种写法是合法的,而在C语言中编译时会报错
二、register关键字升级
register关键字是请求编译器将局部变量存储在寄存器中,从而提高效率(现代编译器优化已经做的很好了,所以实际工程中很难看到这个关键字)
在C语言中,无法获取register变量的地址;
在C++中可以获取到register变量的地址(C++编译器发现有取register变量地址时,会让register对变量的声明变的无效)
三、重名全局变量定义的升级
C语言中可以重复定义多个同名的全局变量不会报错(最终会被链接到同一个地址上)
在C++中,不允许定义重名的全局变量
四、struct的区别
C语言中,struct关键字定义了一组变量的集合,不能单独做为一种类型去定义变量,必须和结构体名连用做为一种类型去使用,可以参考我这篇博客C语言中结构体变量的定义及引用_Rookie Linux的博客-CSDN博客_结构体变量
C++中,struct用于定义一个全新的类型。
比如:
/*C语言中*/
typedef struct Student Stu;
struct Student
{
int num;
char name[10];
}
Stu zhangSan,liSi;//等价于struct Student zhangSan,liSi;
/*C++中*/
struct Student
{
int num;
char name[10];
}
Stu zhangSan,liSi;
五、默认类型的升级
在C语言中,允许有默认类型。
例如:函数 a(); 这表示函数返回值默认int,函数可以接受任意参数
函数 b(void); 这表示函数返回值默认int,函数不接受参数
在C++中,默认类型是不合法的,所有的类型必须显示声明
例如:函数 int a(); 和 函数 int a(void); 表示的意义相同 ,都表示返回值为int,不接受参数
六、函数参数的默认值
C语言中,不允许函数有参数的默认值,而C++允许有参数的默认值。
例如:
int fun(int a = 0,int b = 0)
{
return a;
}
此代码在C语言中,编译是会报错的,而C++中是合法的,如果形参a b都没有传参,则使用默认值。
需要注意的是:函数参数提供是从右向左的,如果调用过程中使用了默认参数,则该参数后面调用的参数必须也使用默认参数。
七、函数占位参数
函数占位参数:占位参数只有参数类型声明,没有参数名声明。
在C语言中,不允许有函数参数占位符,而C++允许函数参数占位符。
例如:
int fun(int a,int)
{
return a;
}
补充:C++使用函数参数默认值和占位参数主要是为了兼容C,将C语言程序移植成C++程序时可以完美的兼容。
八、const关键字的升级
在C语言中,用const修饰的变量,本质是只读变量(不允许出现在赋值号的左边),而不是真正意义上的常量,并且const只在编译期有效,运行期无效
const修饰的局部变量在栈上分配内存,修饰的全局变量在只读存储区分配
C语言中真正意义上的常量只有枚举enum
在C++中,const修饰的是变量是正真意义的常量,值会被放到符号表中,遇到相同的标识符后,用符号表中的值替换
编译过程中若发现以下情况就为const常量分配存储空间(虽然会分配存储空间,但不会使用里面的值,仅仅是为了兼容C语言,但是可以使用指针变量改变这个空间中的值)
1. 对const常量使用extern
2. 对const常量使用&操作符
八、函数重载
在C语言中,不存在函数重载;在C++中可以存在函数重载;
函数重载的判断依据必须至少满足以下一条:
1. 函数名相同,函数的形参的个数不同
2. 函数名相同,函数的形参类型不同
3. 函数名相同,函数的形参顺序不同
函数重载注意事项:
1、函数返回值类型不能做为判断依据
2、函数重载必须发生在同一个作用域内
3、无法直接通过函数名得到重载函数的入口地址(区别于C语言)