C++ 成员函数中两个 const 的区别
1. 示例
cpp
struct Data
{
int value;
};
class Test
{
public:
const Data &getData() const
{
return data;
}
private:
Data data;
};
核心代码:
cpp
const Data &getData() const;
这里有 两个 const:
text
const Data & getData() const
^^^^^ ^^^^^
第一个 第二个
2. 第一个 const:限制函数外部
cpp
const Data &
表示:
函数返回的是
Data的引用,但调用者只能读取,不能通过这个引用修改它。
例如:
cpp
Test test;
int x = test.getData().value; // 可以读取
test.getData().value = 100; // 错误:不能修改
所以可以简单记成:
前面的
const:防止外部通过返回值修改数据。
如果没有这个 const,返回的是普通引用:
cpp
Data &getData();
那么外部就可以:
cpp
test.getData().value = 100;
直接修改类内部的数据。
3. 第二个 const:限制函数内部
cpp
getData() const
表示:
getData()是一个只读成员函数,函数内部不能修改当前对象的普通成员变量。
例如:
cpp
const Data &getData() const
{
data.value = 100; // 错误
return data;
}
因为函数后面有:
cpp
const
所以这个函数承诺:
我只是读取当前对象,不会修改它。
另外,只有这种 const 成员函数才能正常被 const 对象调用:
cpp
const Test test;
test.getData(); // 可以
所以可以简单记成:
后面的
const:防止函数内部修改当前对象。
4. 两个 const 的核心区别
| 位置 | 作用 | 限制谁 |
|---|---|---|
const Data & |
返回的数据不能通过这个引用修改 | 函数外部 |
getData() const |
函数不能修改当前对象 | 函数内部 |
最简单的记忆方式:
cpp
const Data &getData() const;
可以理解成:
前
const管外面,后const管里面。
即:
text
const Data &
↓
外部拿到数据后不能改
getData() const
↓
函数自己执行时不能改对象
5. 为什么经常两个一起使用?
对于这种"只提供数据查询"的函数:
cpp
const Data &getData() const;
两个 const 一起使用最合理:
- 第一个
const:别人拿到数据后不能乱改; - 第二个
const:这个查询函数自己也不能乱改对象。
因此它表达的意思非常明确:
这是一个纯读取接口:里面不改,外面也不能通过返回值改。