c++ const 关键字
c++ const 关键字
作用
- 修饰变量,说明该变量不可改变
- 修饰指针,分为指向指针的常量 (pointer to const) 和 自身是常量的指针 (const pointer)
- 修饰引用,指向常量的引用 (reference to const)
- 修饰成员函数,说明该成员函数内不能修改成员变量
示例
修饰变量
const double PAI = 3.141592653589793;
// PAI = 6.666; // 编译报错,const 修饰的变量不可改变,相当于一个有名字的常量
修饰指向常量的指针
可以修改指针指向的地址,不能修改指针指向的地址的值
int a = 5;
int b = 4;
const int *c = &a; // 指针变量,指向 int 类型的常量
// *c = 2; // 编译报错, 指针指向 int 类型的常量,不能修改指针指向的常量的值
c = &b;
cout << "a = " << a << endl; // 输出 a = 5
cout << "c = " << *c << endl; // 输出 c = 4
int a = 5;
int b = 4;
int const *c = &a; // 也是指针变量,因为 *c 表示的是指针指向的值
// *c = 2; // 编译报错, 指针指向 int 类型的常量,不能修改指针指向的常量的
c = &b;
cout << "a = " << a << endl; // 输出 a = 5
cout << "c = " << *c << endl; // 输出 c = 4
修饰自身是常量的指针
可以修改指针指向的地址的值,不能修改指针指向的地址
int a = 5;
int b = 4;
int* const c = &a; // 指针常量,指向 int 类型变量
*c = 2;
// c = &b; // 编译报错,指针是常量,不能修改指针的值
cout << "a = " << a << endl; // 输出 a = 2, 因为 c 和 a 指向同一个地址,修改了 *c 和 *a 表示同一个值
cout << "c = " << *c << endl; // 输出 c = 2
修饰指向常量的引用
引用是对象的别名,声明时就要初始化,初始化之后就不能再改变指向,所以不存在常引用的说法,只有指向常量的引用。
int a = 5;
const int &b = a;
// int const &b = a; // 效果一样
// int& const b = a; // 效果一样
// b = 3; // 编译报错,不能修改引用的对象的值
cout << b << endl; // 输出 5
修饰成员函数
被 const 修饰的成员函数是线程安全的。
class test {
public:
int get() const; // 常成员函数,在 get() 里不能修改 test 类成员变量的值,除非成员变量用 mutable 修饰
private:
const int a; // 常对象成员,只能类内初始化或初始化列表初始化,初始化之后值不能修改
mutable int b; // 在任何地方都可以修改变量的值
};
int main() {
test t1; // 普通对象,可以调用全部成员函数
const test t2; // 常对象,只能调用长成员函数
}
总结
所有的用法其实都被4个作用概括了,理解透了,无论出现在哪里都能知道表示的是什么。
可以这样记忆:const 后面跟着什么,什么的值就不能改变。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通