【编程笔记】成员函数中两个 const 的区别(const Data &getData() const;)

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:这个查询函数自己也不能乱改对象。

因此它表达的意思非常明确:

这是一个纯读取接口:里面不改,外面也不能通过返回值改。

相关推荐
孟健1 小时前
Claude Code 同需求写两版对比:装不装 frontend-design 差多远?
前端·ai编程·claude
OpsEye2 小时前
大模型 Token 计量不准,是什么原因,怎么解决??
javascript·ai编程
Zhao-Jichao2 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李2 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
梦de天空一米16883 小时前
【一个重复id让游戏卡在62%,聊聊配置表检查】
前端
ryn483983 小时前
01 一个功能模块,怎么分层才不乱
前端·ai编程·claude
Amos_Web3 小时前
通过 Rspack 源码学 Rust(五):读懂 Result 与问号运算符的错误返回
前端
杨航 AI3 小时前
JEV的用法
java·前端·数据库
Amos_Web3 小时前
Rspack 源码解析(三十五):rspack_error 如何用 miette 渲染带源码定位的错误链
前端
去伪存真3 小时前
高敏资产场景下的大模型协同设计架构
前端·agent