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

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

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

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集