首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C/C+编程笔记:const 变量详解!一文了解具体用法

1、C中的const

1、局部const变量存放在堆栈区中,会分配内存(也就是说可以通过地址间接修改变量的值)。测试代码如下:

运行结果:

2、全局const变量存放在只读数据段(不能通过地址修改,会发生写入错误), 默认为外部联编,可以给其他源文件使用(需要用extern关键字修饰)

运行结果:

由于分文件编写,不好呈现,所以在这里不为大家提供c语言全局const变量默认为外部联编的案例。如果各读者有兴趣,可自行尝试。具体步骤如下,可新建一个源文件,并且提供a变量的声明,如:extern const int a。

2、C++中的const

1、普通局部const变量

对于基本类型,以符号表中的数据进行初始化的普通局部const变量,此时不会分配内存,将其放入符号表中,如果对它取地址,则会开辟一个新的空间,也就是说会创建一个临时变量,如果通过地址间接进行修改值不会影响到其本身。测试代码如下:

运行结果:

在这里解释一下上述代码:第二行代码,使用了const(expression),显示转换,这是由于c++比c类型转换更严格。所以需要将 const int * 转换为 int * 才能够进行赋值,并且第二行代码将被隐式转换为如下代码:

int temp=a;

int *ptr=&temp;

//所以对指针 ptr 指向的内存空间进行操作,并不会影响到 a。

对于基本类型,用变量初始化的普通局部const变量,此时会在堆栈区开辟内存,可以通过地址间接修改值。测试代码如下:

运行结果:

(3)对于自定义类型,都会分配内存,可以通过地址间接修改值

运行结果:

2、普通全局const变量

与局部const变量基本相同,只是内存开辟在全局/堆区,对于c++而言,全局const变量默认为内部联编,可以在定义时加extern关键字声明为外部联编。 由于分文件编写不好展示,请读者自行尝试。

3、const 成员变量/成员函数

const成员变量只能被const成员函数访问

const成员函数,能够访问所有成员变量,但是在函数体内不能直接修改变量的值(包括普通成员变量),如果需要在函数体内修改普通成员变量的值,需要在变量定义的前面添加mutable关键字,或者通过地址间接修改。注意:const成员函数只能被该类的const对象访问。测试代码如下:

运行结果:

3、C/C++中const异同总结

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

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

c++中对于局部的const变量要区别对待:

(1)对于基础数据类型,也就是const int a =  10这种,编译器会把它放到符号表中,不分配内存,当对其取地址时,会分配内存。

a在符号表中,当我们对a取地址,这个时候为a分配了新的空间,*p操作的是分配的空间,而a是从符号表获得的值。

(2)对于基础数据类型,如果用一个变量初始化const变量,如果const int a = b,那么也是会给a分配内存。

(3)对于自定数据类型,比如类对象,也会分配内存。

c中const默认为外部连接,c++中const默认为内部连接.当c语言两个文件中都有const int a的时候,编译器会报重定义的错误。而在c++中,则不会,因为c++中的const默认是内部连接的。如果想让c++中的const具有外部连接,必须显示声明为: extern const int a = 10;

希望对你有帮助!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200828A0QZX800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券