【C语言】【C++】关于const的总结

C语言及C++中关于const的总结

目录
C语言中const的用法
const修饰变量
修饰全局变量/修饰局部变量
C++中const的用法
const修饰变量
const修饰成员函数

C语言中

  1. const修饰变量

    可以使用两种形式:

const int a = 10;

int const a = 10;

被const修饰的变量,具有常量的特性,不可以直接赋值。如下图,a不可直接被修改(const无论放在int前还是int后都修饰的是变量a,不是类型int)
在这里插入图片描述

报错:
在这里插入图片描述
const修饰的变量具有常量特性,也可以称为常变量或只读变量,所以在定义时必须赋初值

const修饰的全局变量,其内容存储在只读数据段,其内容无法被修改
const修饰的局部变量,存储在函数相应的栈帧中,随函数结束而释放。因为其还是保存在栈上,理论上是可以被修改的。
可以使用指针间接修改,如下图:

在这里插入图片描述
C语言中const修饰的变量只是具有常量的特性,并不是真正的常量,所以并不能用来初始化数组。(这与C++中const的使用不同,详细见下文)
在这里插入图片描述
总结:C语言中,const的修饰的变量具有常量特性但不是常量,其本质是只读(不可被修改)的变量,拥有变量名、变量类型等属性。
此处要区别于define定义的宏常量,宏常量不具有数据类型,在使用时只进行文本替换,而const修饰的变量具有变量相关属性,在编译时会进行类型安全检查,提高了代码的安全性。

C++中

  • const修饰变量
    C++ 中,被const修饰的变量已经是一个常量,且具有宏替换属性

如下图:局部变量a,将&a的类型强转为(int*)赋给pa指针,可以通过指针pa对a的内容进行修改。
但打印a时,在程序编译阶段已经用常量10将变量名a替换掉了
所以 cout << a 的打印结果为10
cout << *pa 的打印结果为20

在这里插入图片描述
查看反汇编:在这里插入图片描述
可以看出打印a的值时,直接用10进行打印,相当于:
printd(“%d”,10);

C++中const修饰的变量可以用来初始化数组。

C++中const修饰变量的存储
是否为const修饰的变量开辟空间取决于变量的用途和数据类型(区别于C语言中一定会为变量开辟空间,全局变量开辟在数据段,局部变量开辟在栈上)

const修饰基础数据类型*(例如const int a = 10;)
当a仅用于读取内容(例如int b = a 或 cout<< a )时,编译器不会在内存上为其开辟空间,而是在编期间用常量直接对其进行替换。

当对a取地址或使用extern时,或const修饰自定义类型(例如类对象)编译器才会为其分配空间,同C语言一样,全局变量分配在数据段不可被修改,局部变量分配在栈上。

  • const修饰成员函数
    将const修饰的类成员函数称为const成员函数,const修饰成员函数,实际上修饰的是其隐含的this指针,表示this指向的内容不可被修改,即该成员函数中不能对类中的任何成员变量进行修改。

在这里插入图片描述
注意1:const修饰的对象只能调用const成员函数,因为非const成员函数内可能会修改成员变量(const修饰的对象其成员变量不可被修改)
如下图:
在这里插入图片描述
并且const成员函数中只能调用const成员函数,不可以调用其他普通成员函数。
普通成员函数可以调用其他const成员函数(因为不牵扯const成员变量被修改)

注意2:static修饰的成员函数不能被const修饰,因为static修饰的成员函数没有隐藏的this指针。

拓展:const取地址操作符重载
针对const修饰的对象和普通对象进行不同的&操作符重载

在这里插入图片描述

(本文章为自我知识梳理,若有缺漏或错误欢迎评论区指出)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值