[Effective C++]条款22:将成员变量声明为private

news2025/3/29 5:56:19

.
在C++中,将成员变量声明为private而不是public,主要是为了遵循面向对象编程(OOP)的封装原则。他有助于隐藏对象的内部实现细节,提供更好地控制,安全性和可维护性。

1、数据隐藏与封装

  • 将成员变量声明为private可以隐藏类的内部实现细节,防止外部代码直接访问或修改這些变量。同时,类的实现细节可以在不影响外部代码的情况下进行修改。
class BankAccount {
private:
    double balance;  // 余额是私有的,外部无法直接访问

public:
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    double getBalance() const {
        return balance;
    }
};

int main() {
    BankAccount account;
    account.deposit(100.0);
    // account.balance = 1000.0;  // 错误:balance是私有的,无法直接访问
    std::cout << "Balance: " << account.getBalance() << std::endl;
    return 0;
}

2、数据验证与控制

  • 在设置或修改這些变量时,可以进行验证和控制,确保数据的有效性
class Person {
private:
    int age;

public:
    void setAge(int newAge) {
        if (newAge >= 0 && newAge <= 120) {  // 年龄的有效性检查
            age = newAge;
        } else {
            std::cout << "Invalid age!" << std::endl;
        }
    }

    int getAge() const {
        return age;
    }
};

int main() {
    Person person;
    person.setAge(25);
    // person.age = -10;  // 错误:age是私有的,无法直接访问
    std::cout << "Age: " << person.getAge() << std::endl;
    return 0;
}

3、减少耦合

  • 减少类与外部代码之间的耦合。外部代码不需要知道类的内部实现细节,只需要通过公共接口与类进行交互
class Car {
private:
    int speed;

public:
    void accelerate(int increment) {
        speed += increment;
    }

    void brake(int decrement) {
        speed -= decrement;
    }

    int getSpeed() const {
        return speed;
    }
};

int main() {
    Car car;
    car.accelerate(20);
    car.brake(5);
    // car.speed = 100;  // 错误:speed是私有的,无法直接访问
    std::cout << "Current speed: " << car.getSpeed() << std::endl;
    return 0;
}

4、便于维护与扩展

  • 如果要修改类的内部实现,只要公共接口保持不变,外部代码就不需要修改。
class Rectangle {
private:
    int width;
    int height;

public:
    void setDimensions(int w, int h) {
        width = w;
        height = h;
    }

    int getArea() const {
        return width * height;
    }
};

int main() {
    Rectangle rect;
    rect.setDimensions(10, 20);
    // rect.width = 5;  // 错误:width是私有的,无法直接访问
    std::cout << "Area: " << rect.getArea() << std::endl;
    return 0;
}

5、防止误用

  • 防止外部代码误用或滥用类的内部数据,提供代码的健壮性。
class Date {
private:
    int day;
    int month;
    int year;

public:
    void setDate(int d, int m, int y) {
        if (isValidDate(d, m, y)) {
            day = d;
            month = m;
            year = y;
        } else {
            std::cout << "Invalid date!" << std::endl;
        }
    }

    void printDate() const {
        std::cout << day << "/" << month << "/" << year << std::endl;
    }

private:
    bool isValidDate(int d, int m, int y) const {
        // 简单的日期有效性检查
        if (d < 1 || d > 31 || m < 1 || m > 12 || y < 1900) {
            return false;
        }
        return true;
    }
};

int main() {
    Date date;
    date.setDate(15, 10, 2023);
    // date.day = 40;  // 错误:day是私有的,无法直接访问
    date.printDate();
    return 0;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

心法利器[132] | 大模型系统性能优化trick

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2023年新的文章合集已经发布&#xff0c;获取方式看这里&#xff1a;又添十万字-CS的陋室2023年文章合集来袭&#xff0c;更…

六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 深入解析Vue3电商项目&#xff1a;TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…

类与对象(中)(详解)

【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…

Flutter项目之页面实现以及路由fluro

目录&#xff1a; 1、项目代码结构2、页面编写以及路由配置main.dart(入口文件)page_content.dartindex.dartapplication.dartpubspec.yamllogin.dartdio_http.dart 3、Fluro路由routes.dartnot_found_page.dart(路由优化&#xff0c;找不到页面时展示此页面) 4、注册页面 1、项…

《Python实战进阶》第31集:特征工程:特征选择与降维技术

第31集&#xff1a;特征工程&#xff1a;特征选择与降维技术 摘要 特征工程是机器学习和数据科学中不可或缺的一环&#xff0c;其核心目标是通过选择重要特征和降低维度来提升模型性能并减少计算复杂度。本集聚焦于特征选择与降维技术&#xff0c;涵盖过滤法、包裹法、嵌入法等…

C++类与对象的第二个简单的实战练习-3.24笔记

哔哩哔哩C面向对象高级语言程序设计教程&#xff08;118集全&#xff09; 实战二 Cube.h #pragma once class Cube { private:double length;double width;double height; public:double area(void);double Volume(void);//bool judgement(double L1, double W1, double H1);…

Rk3568驱动开发_设备树点亮LED_10

设备树中添加节点 在设备树文件中添加led节点&#xff0c;添加完后需要重新编译内核&#xff0c;因为单独编译这个设备树文件生成的dtb文件目前不能直接做替换&#xff0c;所以要编译内核将编译好的boot.img文件烧录到设备里&#xff0c;boot.img里包含新添加的设备树节点&…

Unity学习之Shader(Phong与Blinn-Phong)

三、Lesson3 1、关键名称 向量 • nDir&#xff1a;法线方向&#xff0c;点乘操作时简称n&#xff1b; • lDir&#xff1a;光照方向&#xff0c;点乘操作时简称l&#xff1b; • vDir&#xff1a;观察方向&#xff0c;点乘操作时简称v&#xff1b; • rDir&#xff1a;光反…

uniapp笔记-swiper组件实现轮播图

思路 主要就是参考 swiper | uni-app官网 实现轮播图。 实例 新建一个banner.vue通用组件。 代码如下&#xff1a; <template><view>轮播图</view> </template><script> </script><style> </style> 随后在index.vue中导…

【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

FPGA_YOLO(二)

上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…

蓝桥杯学习-14子集枚举,二进制枚举

子集枚举 一、回溯3-子集枚举&#xff08;递归实现指数型枚举&#xff09; 一旦涉及选与不选&#xff0c;删和不删&#xff0c;留和不留-->两种状态-->就要想到子集枚举例题1–递归实现指数型枚举19685 其实看不懂这个题目&#xff0c;好奇怪的题目。根据老师的解析来写…

人工智能时代大学教育范式重构:基于AI编程思维的能力培养路径研究

人工智能技术的快速发展正在重塑高等教育的内容与方法。本文以AI编程教育为切入点&#xff0c;通过文献分析与案例研究&#xff0c;探讨AI时代大学教育的核心能力需求与教学范式转型路径。研究发现&#xff0c;AI编程中蕴含的系统性思维训练、项目架构能力和元认知能力培养机制…

<数据集>轨道异物识别数据集<目标检测>

数据集下载链接&#xff1a;https://download.csdn.net/download/qq_53332949/90527370 数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1659张 标注数量(xml文件个数)&#xff1a;1659 标注数量(txt文件个数)&#xff1a;1659 标注类别数&#xff1a;6 标注类别…

Pyecharts功能详解与实战示例

一、Pyecharts简介 Pyecharts是一个基于Python的开源数据可视化库&#xff0c;它基于百度的Echarts库&#xff0c;提供了丰富的图表类型和强大的交互功能。通过Pyecharts&#xff0c;你可以轻松创建各种精美的图表&#xff0c;如折线图、柱状图、饼图、散点图、地图等&#xf…

EasyUI数据表格中嵌入下拉框

效果 代码 $(function () {// 标记当前正在编辑的行var editorIndex -1;var data [{code: 1,name: 1,price: 1,status: 0},{code: 2,name: 2,price: 2,status: 1}]$(#dg).datagrid({data: data,onDblClickCell:function (index, field, value) {var dg $(this);if(field ! …

C语言:扫雷

在编程的世界里&#xff0c;扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识&#xff0c;还能锻炼逻辑思维和解决问题的能力。今天&#xff0c;就让我们一起用 C 语言来实现这个有趣的游戏&#xff0c;并且通过图文并茂的方式&#xff0c;让每一步都清晰易懂 1. 游…

操作系统必知的面试题

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

清华大学.智灵动力-《DeepSeek行业应用实践报告》附PPT下载方法

导 读INTRODUCTION 今天分享是由清华大学.智灵动力&#xff1a;《DeepSeek行业应用实践报告》&#xff0c;主要介绍了DeepSeek模型的概述、优势、使用技巧、与其他模型的对比&#xff0c;以及在多个行业中的应用和未来发展趋势。为理解DeepSeek模型的应用和未来发展提供了深入的…