当前位置: 首页 > news >正文

[Effective C++]条款28:避免返回handles指向对象内部成分

.
在C++中,返回指向对象内部成分的引用(handles)可能会导致封装性降低和对象空悬问题。为了避免這些问题,可以通过返回const引用来限制对内部数据的修改,从而确保只读访问

1、返回内部引用对象

  • 下面代码中getData函数返回一个指向内部数据的引用,外部代码通过这个引用可以直接修改data数据的内容,破坏了对象封装性
#include <iostream>
#include <vector>

class MyClass {
private:
    std::vector<int> data;

public:
    MyClass() : data{1, 2, 3, 4, 5} {}

    // 返回内部数据的引用
    std::vector<int>& getData() {
        return data;
    }
};

int main() {
    MyClass obj;
    std::vector<int>& dataRef = obj.getData();

    // 修改内部数据
    dataRef.push_back(6);

    // 打印内部数据
    for (int val : obj.getData()) {
        std::cout << val << " ";
    }

    return 0;
}

2、解决:返回const引用

  • 返回const引用,外部代码就只能读取数据,而不能修改
#include <iostream>
#include <vector>

class MyClass {
private:
    std::vector<int> data;

public:
    MyClass() : data{1, 2, 3, 4, 5} {}

    // 返回内部数据的const引用
    const std::vector<int>& getData() const {
        return data;
    }
};

int main() {
    MyClass obj;
    const std::vector<int>& dataRef = obj.getData();

    // 尝试修改内部数据(编译错误)
    // dataRef.push_back(6); // 错误:不能修改const对象

    // 打印内部数据
    for (int val : obj.getData()) {
        std::cout << val << " ";
    }

    return 0;
}

思维导图笔记:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/120035.html

相关文章:

  • AI 智能外呼系统的智能体现
  • Python语言的网络编程
  • 大模型FAQ
  • C++-Mongoose(2)-https-server-openssl
  • Java核心技术面试题
  • micro ubuntu 安装教程
  • 【亲测】Linux 使用 Matplotlib 显示中文
  • Solidity入门实战—web3
  • 【Ansible自动化运维】一、初步了解,开启自动化运维之旅
  • STM32定时器完全指南:从基础原理到高级应用 | 零基础入门STM32第九十六步
  • 海外高防服务器延迟优化——跨国业务安全加速的底层逻辑
  • DIY AI ML:K-Means 算法
  • HTML静态网页成品作业(HTML+CSS)——阜阳剪纸介绍设计制作(1个页面)
  • R语言 | 2d概率密度分布图
  • 牛客 226303 【模板】差分
  • SPI通信
  • 重头学java cpu内存硬盘的关系
  • 深度集成学习不均衡样本图像分类
  • Java Functional Interface 函数式接口
  • 大文件断点续传
  • 011_异常、泛型和集合框架
  • 大数据(5)(基础概念)Spark从入门到实战:核心原理与大数据处理实战案例
  • 【算法】前缀和(下)
  • 【Django】教程-12-柱状图
  • 5.JVM-G1垃圾回收器
  • 顺序栈简记
  • 为什么选择Redis?解析核心使用场景与性能优化技巧
  • QML面试笔记--UI设计篇02布局控件
  • 山东大学计算机网络第五章习题解析
  • 虚拟表、TDgpt、JDBC 异步写入…TDengine 3.3.6.0 版本 8 大升级亮点