c++对比c语言进行了哪些增强,一起来看看吧

发布于:2023-01-04 ⋅ 阅读:(134) ⋅ 点赞:(0)


前言

众所周知,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 宏没有作用域且没有数据类型。

总结

以上就是今天分享的全部内容,希望可以给大家带来帮助,我们一同学习,一同进步。


网站公告

今日签到

点亮在社区的每一天
去签到