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

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

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

相关推荐
小李不想当小白21 分钟前
USART串口数据包(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
怕浪猫23 分钟前
前端转全栈最低成本的技术栈选择
前端·javascript·面试
狂师25 分钟前
AI时代我们要如何玩抓包测试:Reqable + AI Agent
前端·程序员·测试
data analyse 45627 分钟前
页面卸载时埋点上报总丢失?sendBeacon 上报与补偿方案
大数据·运维·服务器·前端·数据库·人工智能·数据分析
xier_ran30 分钟前
【infra之路】AI 编译器学习笔记(八):向量化——把小块变成 SIMD 指令
人工智能·笔记·学习
WebInfra35 分钟前
Rsdoctor 2.0 发布:Agent 驱动的全自动优化工具
前端·javascript·node.js
乘风gg36 分钟前
AI Coding 时代最值钱的东西,软件工程(上)
前端·ai编程·claude
IT_陈寒42 分钟前
一文搞懂Vite的核心概念
前端·人工智能·后端
晨间晓44 分钟前
图片到底偏什么颜色?用华为云码道开发 OpenCV 色彩偏移分析工具
javascript·opencv·华为云
data analyse 4561 小时前
前端白屏问题按路由和资源加载顺序定位
大数据·前端·人工智能·数据分析·html