const用于声明不可变对象,提升安全与性能;可修饰变量、指针、函数参数、成员函数及返回值;const对象仅能调用const成员函数;mutable可突破const限制用于内部状态管理。

在C++中,const关键字是一个非常重要的修饰符,用于声明不可变的变量、函数参数、成员函数和指针等。合理使用const不仅能提高代码的安全性和可读性,还能帮助编译器进行优化。下面从多个角度详细说明const的常见用法和作用。
1. const修饰基本数据类型变量
用const修饰的变量表示其值不能被修改,必须在定义时初始化。
- const int a = 10; // a的值不能改变
- int const b = 20; // 等价于上面的写法
- // a = 30; 错误!不允许修改const变量
这种常量在编译期可能被直接替换为字面值,避免运行时开销。
2. const与指针的结合使用
const和指针结合时容易混淆,关键在于理解const修饰的是指针本身还是指针指向的内容。
立即学习“C++免费学习笔记(深入)”;
- const int* p; // 指针p指向一个常量,内容不可改,指针可变
- int const* p; // 同上,等价写法
- int* const p; // 指针p是常量,地址不可变,内容可改
- const int* const p; // 指针和内容都不可变
记忆技巧:看const紧邻的是*还是变量名。若const在*左边,修饰内容;在*右边,修饰指针。
3. const修饰函数参数
当函数参数为指针或引用时,使用const可以防止函数内部意外修改实参。
这对大型对象尤其重要,既能避免拷贝开销(用引用/指针),又能保证安全性。
4. const成员函数
在类的成员函数后加上const,表示该函数不会修改类的任何成员变量(mutable除外)。
只有const成员函数才能被const对象调用。这有助于实现接口的只读访问。
5. const与返回值
返回值为const类型时,通常用于防止不必要的赋值操作,尤其是重载运算符时。
- const std::string operator+(const std::string&, const std::string&);
- // 防止 (a + b) = c 这类非法操作
对内置类型返回const意义不大,但在自定义类型中可增强安全性。
6. const对象与构造
const对象一旦创建就不能修改,且只能调用const成员函数。
- const MyClass obj;
- obj.getValue(); // OK,getValue是const函数
- // obj.setValue(5); 错误!非const函数不能被const对象调用
const对象必须通过构造函数初始化,之后所有成员进入只读状态。
7. mutable关键字与const的例外
有时需要在const成员函数中修改某个成员变量,比如用于缓存或计数器,这时可用mutable修饰该成员。
- class Logger {
- mutable int callCount;
- public:
- void log() const { ++callCount; } // 允许修改mutable成员
- };
mutable突破了const的限制,但应谨慎使用,仅用于逻辑上“不变”的对象中的内部状态管理。
基本上就这些。const的核心思想是“承诺不修改”,它贯穿于变量、函数、对象等多个层面,是编写高质量C++代码的重要工具。掌握const的用法,能让代码更安全、清晰,并提升性能。不复杂但容易忽略细节。


