const在C与C++中的区别

1、C语言中全局const变量会存储到只读数据段,C++中全局const变量声明为extern或者对变量取地址时,编译器会分配内存,变量存储在只读数据段。两个都受到了只读数据段的保护,不可修改。

const int constA = 100;
int main()
{
       int* p = (int*)&(constA);
       *p = 200;
       
       return 0;
}

运行结果:
const在C与C++中的区别_第1张图片
以上代码在C/C++中均编译通过,但是在运行期修改constA的值时,发生写入错误,原因是修改只读数据段的数据。

2、C语言中局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但是可以跳过编译器的检查,通过指针间接修改const的值。

int main()
{
       const int constA = 100;
       int* p = (int*)&(constA);
       printf("constA = %d\n", constA);
       *p = 200;
       printf("*p = %d\n", *p);
       
       return 0;
}

运行结果:
在这里插入图片描述
3、C++中的局部const变量:

  • 对于基础数据类型,即int、double等,编译器会将它放到符号表中,不分配内存,当对其取地址时,会分配内存。
int main()
{
       const int constA = 100;
       int* p = (int*)&(constA);
       *p = 200;
       cout << "constA = " << constA << endl;
       cout << "*p = " << *p << endl;
       
       return 0;
}

运行结果:
const在C与C++中的区别_第2张图片
constA在符号表中,当对constA取地址,这个时候为constA分配了新的空间,* p操作的是分配的空间,而constA是从符号表中获取的值。

  • 如果用一个变量初始化一个const基础数据类型变量,那么也会给这个const变量分配内存空间,可以通过指针修改其值。
int main()
{
       int b = 100;
       const int constA = b;
       int* p = (int*)&(constA);
       *p = 200;
       cout << "constA = " << constA << endl;
       cout << "*p = " << *p << endl;
       
       return 0;
}

运行结果:
const在C与C++中的区别_第3张图片

  • 自定义数据类型的const变量,例如类对象,也会分配内存,可以通过指针间接修改数据成员的值。
class Person
{
public:
       int age;
       string name;
};
int main()
{
       const Person person; //未初始化age
       // person.age = 20;  // 无法修改
       
       Person* pPerson = (Person*)&person;
       pPerson->age = 100;  // 指针间接修改

       cout << "pPerson->age:" << pPerson->age << endl;
       
       return 0;
}

运行结果:
const在C与C++中的区别_第4张图片
const由C++采用,并加进标准C中。在C语言中const默认为外部连接,C++中const默认为内部连接。当C语言中两个文件中有同名const变量时,编译器会报重复定义,在C++中就不会。若想让C++中的const成为外部连接,必须用extern显式声明。

你可能感兴趣的:(C/C++)