C语言到C++的升级

一、变量定义的升级

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语言)    

你可能感兴趣的:(C/C++,c++,c语言)