C语言及C++中关于const的总结
目录
-
C语言中const的用法
-
const修饰变量
修饰全局变量/修饰局部变量
C++中const的用法
- const修饰变量
- const修饰成员函数
C语言中
-
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修饰的对象和普通对象进行不同的&操作符重载
(本文章为自我知识梳理,若有缺漏或错误欢迎评论区指出)