前言
众所周知,c++是基于c语言的基础创造出来的,那么c++对比c语言哪些地方得到了优化呢,让我们一起来看看吧。
一、全局变量检测增强
c语言只对局部变量有重定义检测,对全局变量不会进行重定义检测,c++对此进行了优化。
代码如下:
int a = 10; //赋值,当做定义
int a; //没有赋值,当做声明
int main(){
printf("a:%d\n",a);
return EXIT_SUCCESS;
}
此代码在c下编译通过,在c++下编译失败,会显示重定义错误。
二、函数检测增强
1.参数类型检测
代码如下(示例):
void getRectS(w, h)
{
}
如图所示,该函数没有定义参数类型,在c语言中可以传递任何类型的参数,而在c++下会发生报错,c++要求必须明确函数参数类型。
2.返回值检测
代码如下(示例):
int getRectS(int w, int h)
{
}
如图,该函数设定的返回值为int型,而实际返回值为空,该写法在c语言下可以跑过,而在c++中则会发生报错,c++要求实际返回值类型必须和设定值类型相同。
3.传参个数检测
int getRectS(int w,int h)
{
return w+h;
}
void test02()
{
getRectS(10, 10, 10);
}
如图,实际传参个数和设定值不相同,该代码在c语言下可以跑过,而在c++下则会发生报错
三、类型转换检测增强
void test03()
{
char * p = malloc(sizeof(64)); //malloc返回值是void*
}
malloc的返回值类型为void*,和char* 不符,c语言下不会发生报错,而c++则会报错
四、struct增强
1.c++的结构体中可以定义函数
struct Person
{
int m_Age;
void plusAge(); //c语言中struct不可以加函数
};
2.c++定义结构体时不需要再加关键字
c中定义结构体变量需要加上struct关键字,c++不需要。
五、新增bool类型关键字
c++的bool类型有两种内建的常量true(转换为整数1)和false(转换为整数0)表示状态。这三个名字都是关键字。
1、bool类型只有两个值,true(1值),false(0值)
2、bool类型占1个字节大小
3、给bool类型赋值时,非0值会自动转换为true(1),0值会自动转换false(0)
六、三目运算符增强
在c中三目运算符返回的是数据值,为右值,不能赋值。
在c++中三目运算符返回的是变量,可以作为左值赋值。
void test()
{
int a = 10;
int b = 20;
printf("ret = %d \n", a > b ? a : b);
(a > b ? a : b) = 100; // 20 = 100 C语言返回的是值
}
c语言若想模仿c++的写法,则可以使用如下写法
void test
{
int a = 10;
int b = 20;
printf("ret = %d \n", a > b ? a : b);
*(a > b ? &a : &b) = 100;
}
七、const增强
1.c语言中的const是伪常量,可以通过指针修改
//7、 const增强
const int m_A = 10; //收到保护,不可以改
void test07()
{
//m_A = 100;
const int m_B = 20; //伪常量
//m_B = 100;
int * p = (int *)&m_B;
*p = 200;
printf("*p = %d , m_B = %d \n", *p, m_B);
//int arr[m_B]; 不可以初始化数组
}
在c语言中,const常量是会分配内存的,可以通过指针指向它的地址,再解引用进行修改。而且const定义的常量不能用来初始化数组。
2.c++中的const会放到符号表中
c++中的const会存在符号表中,直接进行替换,不分配内存
3.const的链接问题
c语言中的const默认是外部链接,c++中的const默认是内部链接
4.const的内存分配情况
c++中的const在特定情况下也会被分配内存,凡是分配内存的常量,都可以通过指针去更改
4.1对变量取地址,会分配临时内存
void test01()
{
const int m_A = 10;
int * p = (int*)&m_A; //会分配临时内存
}
4.2extern关键字下的const会分配内存
4.3用普通变量初始化的常量会分配内存
void test02()
{
int a = 10;
const int b = a; //会分配内存
int * p = (int *) &b;
*p = 1000;
cout << "b = " << b << endl;
}
4.4 自定义数据类型会分配内存
5.尽量用const代替define
const和define拥有类似的功能,但define具有一定的缺陷,例如define 宏没有作用域且没有数据类型。
总结
以上就是今天分享的全部内容,希望可以给大家带来帮助,我们一同学习,一同进步。