【编程笔记】成员函数中两个 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:这个查询函数自己也不能乱改对象。

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

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

相关推荐
宿6741 小时前
vue3-async
前端·javascript·vue.js
YXWik62 小时前
记录前端请求接口在浏览器请求响应的Preview和Response展示的一样的问题
前端
2501_928996222 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
东风破_2 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
原则猫2 小时前
TS 类型工具
前端
tju新生代魔迷2 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
excel3 小时前
Nuxt + Twin CSS 中宽度超过屏幕时底部出现空白的原因与解决方案
前端·javascript
点心的游戏开发世界3 小时前
UnityShaderGraph滚动UV笔记
笔记·uv
瑞码空间4 小时前
git知识点黄金笔记
笔记·git·elasticsearch