C语言与C++中const关键字的区别

问题提出:

我们都知道当我们想创建一个常量的时候,会想到const关键字。但是当我们使用const关键字时,是否真的会创建出一个常量,C语言与C++语言对于const关键字的使用到底有什么区别呢?

1.伪常量与真正的常量

我们先看看C语言:

定义一个全局常量g_A,内存开辟到常量区,受到常量区保护,直接修改和间接修改都不能改变这个常量的值。(语法通过但是运行失败)

const int g_a = 100; //定义一个全局const常量

int main() {

	//g_A = 200;
	int* p = &g_a;
	*p = 200;
	printf("%d\n", g_a);

	system("pause");
	return EXIT_SUCCESS;
}

定义一个局部常量m_b,局部变量开辟到栈区,直接修改不能改变变量的值,但是通过指针可以间接修改所谓的“常量”。我们习惯把它称为伪常量。

int main() {

	const int m_b = 100;
	//m_b = 200;//直接修改error
	int* p = &m_b;
	*p = 200;
	printf("%d\n", m_b); //200

	system("pause");
	return EXIT_SUCCESS;
}

再看看C++语言有什么区别吧:

对于全局常量,C++语言与C语言结论一致,无论是直接修改还是间接修改都不能改变常量的值。

但是对于局部常量,直接修改和间接修改也都不能改变常量的值。所以我们称C++下的const关键字会修饰真正的常量!

int main() {
	
	const int m_B = 100; // 定义局部常量
	//m_B = 200; // 直接修改error
	int* p = (int*)&m_B;
	*p = 200;
	cout << "m_B= " << m_B << endl; //100 间接修改不能改变局部常量
	
	system("pause");
	return EXIT_SUCCESS;
}

什么原因呢?经过查阅资料了解到,局部常量其实是存储到符号表中,并不分配内存。当对const修饰的局部变量取地址时,编译器给变量分配临时内存空间temp,p指针指向的是temp。*p也无法更改m_B变量,只能更改temp空间里的值。

2.const关键字在C与C++中的链接属性不同

C语言下,const修饰的全局变量默认是外部链接属性。所谓外部链接属性就是,同项目的其他文件在本文件中不用包含头文件就可以使用。只需要在本文件中extern声明一下全局变量就可以使用其他文件中的全局常量了。

然后再C++语言下,const修饰的全局变量默认是内部链接属性。所谓内部链接属性就是只能在本文件中使用。如果想让他变成外部链接属性,可以加extern关键字,提高它的作用域。其实C语言中是编译器默认隐式的加上了extern关键字。

猜你喜欢

转载自blog.csdn.net/weixin_56067923/article/details/128702968