什么是 C++中的const?
🚀 什么是 const
?
const
的意思就是:不能改!
举个例子:
const int a = 5;
a = 10; // 错误!因为 a 是 const 的,不能改
就是这么简单!
🍎 举例1:常量变量
const int x = 100;
意思是:x 永远是100,不能变了。
🍔 举例2:函数参数用 const
(防止修改)
void print(const int a) {
// a 不能被改
cout << a << endl;
这表示:a
是一个只读参数,函数里不能改它的值。
🍟 举例3:引用 + const(超级常用!)
void print(const string& str) {
cout << str << endl;
这个很重要!表示:
-
str
是传引用(效率高) -
const
表示不能在函数里改这个字符串
🧊 举例4:指针 + const
你只记住下面这三种情况就够了:
写法 | 含义 |
---|---|
const int* p | 指向常量的指针(不能改 *p) |
int* const p | 常量指针(不能改 p) |
const int* const p | 两个都不能改(*p 不能改,p 也不能改) |
📦 举例5:类的 const 成员函数
class Person {
public:
void show() const {
// 这里不能改任何成员变量
}
}
这个 const
是说:我保证这个函数只用来看,不动任何数据。
🧠 总结口诀:
加了 const,表示不能改!
你以后只要看到 const
,就问自己一句:“是不是说它不能改?”
我们下面再来看一个详细版本
const
是 constant
的缩写,意思是 “不变的”。
在 C++ 中,它的作用是:
👉 告诉编译器某个变量(或函数)不允许被修改。
一、const 修饰普通变量
const int a = 7;
a = 8; // ❌ 错误:a 是常量,不能改
可以赋值给别人:
int b = a; // ✅ 正确
🚨 注意:const 虽然值不能改,但地址指向的内容可以被“非常规方式”改掉!
const int a = 7;
int* p = (int*)&a;
*p = 8;
cout << a; // 输出还是 7,而不是 8
解释:编译器会 优化 const 值的读取,不会重新读取内存中的值,所以就算你偷偷改了,也没用。
💡 想避开优化怎么办?
用 volatile
:
volatile const int a = 7;
int* p = (int*)&a;
*p = 8;
cout << a; // ✅ 现在输出 8
二、const 修饰指针变量(重点!)
👉 口诀记忆:
“左定值,右定向,const 修饰不变量”
A)const
修饰指针指向的内容
const int* p = &a;
-
可以改
p
指向别的地址 -
不可以改
*p
的内容(p 指向的值)
🔹 例子:
*p = 8; // ❌ 错误
p = &b; // ✅ 正确
B)const
修饰指针本身
int* const p = &a;
-
p
不能再指向其他变量 -
但可以改
*p
的值
C)都修饰(完全只读)
const int* const p = &a;
-
p
不能变 -
*p
也不能变
三、const 修饰函数参数和返回值
A)值传递 + const(不常用)
void func(const int a);
值传递时参数本身就是拷贝,用 const
没多大必要,但加上可以防止误操作。
B)引用传递 + const(常用!)
void show(const string& str);
-
不复制,效率高
-
不可修改,安全
C)指针参数 + const
void func(const int* p); // 不能改 *p 的值
void func(int* const p); // 不能改 p 指向的地址
D)函数返回值 + const
const int getValue();
如果函数返回 const
值,说明这个值不能再被赋值了:
getValue() = 10; // ❌ 错误
如果返回对象或引用,也可以加 const
限制只读性:
const Test& getTest();
四、const 修饰类成员函数
class MyClass {
public:
int getVal() const; // ✅ 说明函数不会改成员变量
}
如果你这样写:
void show(const MyClass& obj) {obj.getVal(); // ✅ 正常 }
但如果 getVal()
没加 const
,就会报错,因为 obj
是只读的。
✅ 小贴士:加了 const 的成员函数,不能改成员变量。
那如果我真的想改某个成员变量怎么办?
五、mutable 修饰变量(在 const 函数中也能改)
class Test {
public:
void work() const {
++_counter; // ✅ 成功
}
private:
mutable int _counter;
};
🔹 只有 mutable
修饰的成员变量,在 const 成员函数中才能被修改。
✅ 总结(最重要的点):
用法 | 意义 |
---|---|
const int a = 5; | a 是常量,不能变 |
const int* p | 指向的值不能改 |
int* const p | 指针地址不能改 |
const int* const p | 什么都不能改 |
void func(const int a) | 参数不能在函数中被改 |
void func(const int& a) | 引用参数,不复制,又不能改 |
int get() const | 函数保证不改类成员变量 |
mutable | 即使在 const 函数中也能改这个变量 |