C++中const关键字增强

版权声明: https://blog.csdn.net/qq_40794602/article/details/85108368

.c文件

#include<stdio.h>
const int m_a = 10;  //全局作用域的const不能使用指针进行修改
int main()
{
	const int m_b = 10;
	int *p = (int *)&m_b;
	*p = 100;//C语言中可以通过这种方式进行修改
	printf("m_a:%d   *p:%d\n", m_b,*p);//m_a和*p打印的都是100
	return 0;
}

.cpp文件

#include<iostream>
using namespace std;
const int m_a = 10; //C++const修饰的全局作用域同样不可以修改
int main()
{
	const int m_b = 10;
	int *p =(int *)&m_b; //这里一定要进行强制转换,C+对类型控制的比较严格
	*p = 100;
	cout << "m_b:" << m_b << "   " << "*p:" << *p << endl; //m_b打印的还是10,*p打印的是100
	return 0;
}

在C++语言中const int m_a = 10;会在内存中生成一个符号表,m_a指向10,并不会为m_a分配内存,当执行int *p = &m_a;时,会为*p开辟新的空间,所以修改了*p的值并不会修改m_a的指向的值

在C语言中 const修饰的变量默认是外部链接(即extern),在C++中const修饰的变量默认是内部链接(static),不过我们可以在const前加上static或者extern来控制这个变量究竟是内部链接还是外部链接

C++const分配内存,在一般情况(const int  a = 100)不会为这个修饰的变量分配内存,所以我们无法通过指针进行修改。但是以下情况,C++会为const修饰的变量分配内存,也就是说以下情况可以通过指针修改被const修饰的变量的值(针对局部作用域的变量)

#include<iostream>
using namespace std;
int main()
{
	//1.对const取地址会分配内存
	const int a = 10;
	int *p = (int *)&a;//此时会为*p分配内存
	*p = 100;
	cout <<"*p:"<< *p << endl;
	//2.2、当加入extern 修饰const,也会分配内存  全局区 指针不能修改
	//extern会将const修饰的变量提升为全局变量,但是不能修改因为该变量是在全局区的ro.data区 全局变量没有用extern const修饰, 而是单纯的const修饰, 那么全局变量位置还是处于ro.data,只是作用域变小,当前文件内。
	
	
	//3.用变量初始化const变量
	int b = 10;
	const int c = b;
	*(int *)(&c) = 100; //因为分配了内存便可以使用指针进行修改
	cout << "c:" << c << endl;

	//4.const 修饰的自定义数据类型
	struct Test
	{
		int e;
	};
	const Test d;
	Test *p2 = (Test *)&d;
	p2->e = 100;
	cout << "d.a:" << d.e<< endl;

	return 0;
}

C++中推荐使用const代替宏定义

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/85108368