C/C++中关键字const
一、const是什么
const 是 C/C++ 里的“常量修饰符”,用来声明“只读”的变量或对象。打个比方:你给变量上了“警示标签”,告诉编译器和程序员“这个东西不准改”。
二、const的作用
- 保护数据:把变量设为只读,防止被意外修改。
- 节省空间:编译器可以把常量直接放在符号表里,不一定要给它留内存。
- 提高效率:访问常量时,不用读写内存,直接把值“灌”进机器指令里。
三、const的九种常见用法
1. const 变量
- 特性:声明时必须初始化,以后不能改。
- 示例:
const int maxUsers = 100; // maxUsers = 50; // 错误:只读变量不能赋值 // const int x; // 错误:const 变量未初始化
2. const 全局替代宏
- 用
const替代#define,好处是:- 带类型检查
- 作用域更清晰
- 示例:
const double PI = 3.1415926;
3. const 结构体
- 把整个结构体当只读用,成员都不能改。
- 示例:
struct Point { int x, y; }; const struct Point p = {10, 20}; // p.x = 5; // 错误:结构体成员不可修改
4. const 类对象
- 对象的方法里加
const的是只读版,不能改成员,也不能调用非const方法。 - 示例:
class Logger { public: Logger(int lvl): level(lvl) {} void show() const { std::cout << level; } void set(int lvl) { level = lvl; } private: int level; }; const Logger log(2); log.show(); // ✅ 可以 // log.set(3); // ❌ 错误:非 const 方法不能调用
5. 指向 const 的指针
- 指针类型:
const int *p—— 通过p不能改它指向的值,但p自己可以指向别的地方。 - 示例:
int a = 1, b = 2; const int *p = &a; // *p = 3; // ❌ 错误 p = &b; // ✅ 合法
6. const 指针
- 指针本身不能改指向,写法
int * const p,但它能修改指向的数据。 - 示例:
int x = 5, y = 6; int * const p = &x; *p = 10; // ✅ 合法 // p = &y; // ❌ 错误:指针地址不可变
7. 指向 const 的 const 指针
- 写法
const int * const p,既不能改指针,也不能改数据。 - 示例:
int v = 42; const int * const p = &v; // *p = 7; // ❌ // p = &v; // ❌
8. const 作为函数参数
- 值传递:
void f(const int x)—— 函数内部不能改x。 - 指针传递:
void f(const int *p)—— 不能通过p修改指向的内容。 - 示例:
void printVal(const int n) { // n = 5; // ❌ 错误 printf("%d\n", n); } void modifyPtr(const int *p) { // *p = 5; // ❌ 错误 } void changePtr(int *p) { *p = 5; // ✅ 合法 }
9. const 返回值(引用)
- 当函数返回引用时,加
const可以防止外部修改它。 - 示例:
const int& getMax() { static int best = 100; return best; } int main() { const int &r = getMax(); // r = 200; // ❌ 错误 }
10. const 成员变量 & 成员函数
- 成员变量:必须在构造函数初始化列表里赋值。
class Settings { public: Settings(int lvl): level(lvl) {} private: const int level; }; - 成员函数:在方法后加
const,表示不会改成员数据。class Data { public: int get() const { return x; } private: int x = 0; };
小结:
const修饰的是“只读权”,不论是变量、指针还是对象,都把“改它”这件事锁死。- 指针相关的常见组合:
const T* p:指向 const,不可修改值;T* const p:const 指针,不可修改指向;const T* const p:两者都不可修改。- 把能锁死修改的地方都标成
const,既能提升程序安全性,也让编译器帮你做更多优化。

1680

被折叠的 条评论
为什么被折叠?



