进一步理解C++里的封装有什么作用

当谈论封装时,我们实际上是在讨论面向对象编程中的一个重要概念,即数据隐藏。封装通过将数据和操作数据的方法捆绑在一起,从而防止外部对象直接访问和修改类的内部数据,以保护数据的完整性和安全性。

用费曼学习法(Feynman Technique)来解释封装:

1. 选择一个概念

概念:封装(Encapsulation)

2. 教给一个孩子

孩子的问题: “爸爸,我在学习编程,但是老师讲的封装是什么意思?”

爸爸的回答: “嗯,想象你有一个秘密宝箱,里面装着你最喜欢的玩具。现在你想要和朋友们一起玩,但是又不想让他们直接拿走你的玩具,因为你担心他们会弄坏它们。所以你找了一个小锁来锁住宝箱,并且只有你知道锁的密码。这样,你的玩具就安全了。”

3. 回顾和简化

在这个例子中,秘密宝箱就好像是一个类,里面装着玩具(数据)。通过给宝箱加上锁和密码,我们阻止了别人直接访问宝箱内的玩具。这种防止外部直接访问内部数据的方法就是封装。

4. 回答问题,巩固知识

封装的目的是保护类的内部数据,防止外部直接访问和修改。通过封装,我们可以确保数据的安全性和完整性,同时隐藏了类的实现细节,使得类的使用者只需关注类提供的接口,而无需了解其内部实现细节。

5. 确认和简化

所以,封装就像是一个安全的保险柜,可以保护内部的数据不被轻易访问和修改,只有通过类提供的接口(方法)才能间接操作内部数据,这样就提高了代码的安全性和可维护性。

希望这个例子能帮助你更好地理解封装在面向对象编程中的作用。

如果不用封装会造成损坏的例子

假设我们有一个名为 BankAccount 的类,它具有一个公共属性 balance,表示银行账户的余额。现在我们创建了另一个类 Hacker,这个类有一个方法 stealMoney(),它可以访问 BankAccount 类的公共属性 balance 来偷取资金。

以下是示例代码:

#include <iostream>class BankAccount {
public:int balance;BankAccount(int initialBalance) : balance(initialBalance) {}void deposit(int amount) {balance += amount;std::cout << amount << " deposited. New balance: " << balance << std::endl;}void withdraw(int amount) {if (balance >= amount) {balance -= amount;std::cout << amount << " withdrawn. New balance: " << balance << std::endl;} else {std::cout << "Insufficient funds!" << std::endl;}}
};class Hacker {
public:void stealMoney(BankAccount& account) {// 偷取账户余额std::cout << "Hacker steals money! Balance: " << account.balance << std::endl;}
};int main() {BankAccount myAccount(1000);Hacker evilHacker;myAccount.withdraw(500); // 用户自己取款evilHacker.stealMoney(myAccount); // 黑客偷钱return 0;
}

在这个例子中,Hacker 类有一个 stealMoney() 方法,它接受一个 BankAccount 对象作为参数,并且可以直接访问该对象的公共属性 balance,这就导致了一个安全问题,因为任何具有 Hacker 对象的代码都可以轻松地访问银行账户的余额,而不受任何限制。

这种情况下,如果我们希望保护银行账户的余额不被未经授权的类访问,就需要使用封装。通过将 balance 属性声明为私有,并提供只能由 BankAccount 类自身调用的方法来操作余额,我们可以确保银行账户的安全性和数据完整性。

如何访问C++类里的私有属性

在C++中,除了类内的方法之外,还可以使用友元函数或友元类来访问私有成员。友元函数是被允许访问类的私有成员的非成员函数,而友元类则是允许访问另一个类的私有成员。

下面是一个示例:

#include <iostream>class MyClass {
private:int privateVar;// 声明友元函数friend void friendFunction(MyClass&);public:MyClass() : privateVar(0) {}void setPrivateVar(int value) {privateVar = value;}int getPrivateVar() {return privateVar;}
};// 定义友元函数
void friendFunction(MyClass& obj) {// 友元函数可以访问类的私有成员obj.privateVar = 42;
}int main() {MyClass obj;// 友元函数可以访问私有成员friendFunction(obj);std::cout << "Private variable value: " << obj.getPrivateVar() << std::endl;return 0;
}

在这个示例中,friendFunction 被声明为 MyClass 的友元函数,因此可以访问 MyClass 的私有成员 privateVar。在 main 函数中,我们调用了 friendFunction 来修改 privateVar 的值,然后通过 getPrivateVar 方法来验证私有成员的值是否被修改。

总之,在C++中,除了类内的方法之外,友元函数和友元类也可以访问类的私有成员。

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

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

相关文章

leetcode 322.零钱兑换

思路&#xff1a;完全背包。 首先分析问题我们可以知道&#xff0c;这个题的本质就是对于每一个硬币选于不选的问题&#xff0c;也就是所谓的背包问题。而后&#xff0c;这里的每一个硬币都是无限多的&#xff0c;也就是说&#xff0c;这不是01背包或者其他背包问题&#xff0…

Claude 3似乎比GPT-4性能更高,更多的人在尝试使用它

Anthropic 是 OpenAI 的主要竞争对手之一&#xff0c;于 3 月初推出了其最新的大型语言模型 (LLM)&#xff0c;称为 Claude 3。事实证明&#xff0c;Claude 3 的性能优于 OpenAI 的旗舰产品 GPT-4&#xff0c;这让 AI 社区感到惊讶&#xff0c;这标志着 GPT-4 的第一个实例被超…

C++中string容器的元素访问

以string容器为例&#xff0c;容器中元素访问的方式有三种&#xff1a; 1.下标[ ]运算符重载 访问元素 普通对象&#xff1a;char& operator[] (size_t pos) 常对象&#xff1a;const char& operator[] (size_t pos) const string s1("abcdefg"); cout &…

线程的常用方法有哪些?

1、典型回答 线程常用方法有以下这些&#xff1a; start()&#xff1a;启动线程&#xff0c;并调用线程的 run() 方法来执行任务。run()&#xff1a;线程的实际工作方法 (普通方法)&#xff0c;定义线程要执行的任务。sleep(long millis)&#xff1a;暂停当前线程的执行&#…

镜像中更新cuda 配置

1. 进入base 镜像对应的容器&#xff1a; 1.1 docker run -it --gpus all -v /home/huangxiujie:/home/huangxiujie iregistry.baidu-int.com/huangxiujie/tsai_reversing:paddlecloud-v2.3.0-gcc820-cuda11.0_cudnn8-nccl2.12.10 /bin/bash 1.2. docker 挂载本地目录 docker…

Java只有中国人在搞了吗?

还是看你将来想干啥。想干应用架构&#xff0c;与Java狗谈笑风生&#xff0c;沆瀣一气&#xff0c;你就好好写Java&#xff0c;学DDD&#xff0c;看Clean Architecture。你想成为炼丹玄学工程师&#xff0c;年入百万&#xff0c;就选python&#xff0c;专精各种paper。你不在意…

对话李喆:Martech在中国需要转化成以客户需求为驱动的模式

关于SaaS模式在中国的发展&#xff0c;网上出现多种声音。Marteker近期采访了一些行业专家&#xff0c;围绕SaaS模式以及Martech在中国的发展提出独特观点。赛诺贝斯副总裁李喆认为&#xff0c;SaaS可以分为场景化的SaaS、一体化的SaaS和功能化的SaaS&#xff0c;三者都有一定规…

【vue3学习之路(一)】

文章目录 前言一、vue3项目创建1.1环境准备1.1.1 基于 vue-cli 创建&#xff08;脚手架创建&#xff09;1.1.2 基于 vite 创建&#xff08;推荐&#xff09; 二、熟悉流程总结 前言 参考视频&#xff1a;https://www.bilibili.com/video/BV1Za4y1r7KE?p10&spm_id_frompag…

Switch搜不到5g wifi

Switch偶尔可以连上5GHz的SSID&#xff0c;但有时却又搜不到&#xff0c;其实只是频道在作祟。 频道是为了减少干扰 Switch仅有特定频道才能连接 刚刚提到&#xff0c;不论2.4GHz或是5GHz频段都有不同的频道可以选择&#xff0c;即便都是2.4GHz频段选择不同频道才能避免之间的…

代码随想录算法训练营第五十七天|647 回文子串 516.最长回文子序列

647. 回文子串 https://leetcode.com/problems/palindromic-substrings/ 思路&#xff1a; 当我们看到两个下标 i&#xff0c; j 上 s[i] ! s[j], 那么 s[i: j1] 一定不是回文子串。 如果s[i] s[j], 那么我们可以在检查 s[i1: j] 是不是回文串。如果暴力搜索的话是 O(n^3) 的…

【设计模式】单例模式详解

单例模式&#xff1a; 定义&#xff1a;确保一个类在任何情况下都绝对只有一个实例&#xff0c;并提供一个全局访问点。为了防止出现重复的创建。 单例模式是JAVA中最简单的设计模式之一。属于创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个…

辅助功能IOU(交并比)_3.2

实现两个目标框的交并比候选框在多目标跟踪中的表达方式及相应转换方法 IOU(Intersection over Union)&#xff0c;“交并比”&#xff0c;是计算机视觉和图像处理中常用的一个评价指标&#xff0c;尤其在目标检测任务中用来衡量模型预测的目标框与真实目标框的重合程度。 具体…

(附源码)基于Spring Boot + Vue的招聘平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

服务消费微服务

文章目录 1.示意图2.环境搭建1.创建会员消费微服务模块2.删除不必要的两个文件3.检查父子模块的pom.xml文件1.子模块2.父模块 4.pom.xml 添加依赖&#xff08;刷新&#xff09;5.application.yml 配置监听端口和服务名6.com/sun/springcloud/MemberConsumerApplication.java 创…

【windows】安装 Tomcat 及配置环境变量

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【学习】Python库addict,使用Dict 的类

from addict import Dict 这行代码导入了 Dict 类&#xff0c;它来自于 addict 模块。在这个上下文中&#xff0c;addict 是一个 Python 库&#xff0c;它提供了一个名为 Dict 的类&#xff0c;用于创建可通过属性访问的字典对象。 使用 addict 中的 Dict 类可以方便地创建字典…

【大模型】VS Code(Visual Studio Code)上安装的扩展插件用不了,设置VS Code工作区信任

文章目录 一、找到【管理工作区信任】二、页面显示处于限制模式&#xff0c;改为【信任】三、测试四、总结 【运行环境】win 11 相关文章&#xff1a; 【大模型】直接在VS Code(Visual Studio Code)上安装CodeGeeX插件的过程 【问题】之前在 VS Code上安装 CodeGeeX 插件后&…

Qt创建窗口选择的三个父类介绍 ----- QWidget、QMainWindow、QDialog

QWidget类 简介 QWidget是Qt中所有用户界面元素的基类。它提供了窗口的基本功能&#xff0c;并允许用户自定义窗口的外观和行为。QWidget可以包含其他QWidget子类的子窗口&#xff0c;从而实现复杂的用户界面。 特性 提供了窗口的基本功能&#xff0c;包括绘制、事件处理、…

Linux命令学习入门

文章目录 登录注销关机重启Vim编辑器快捷键文件目录类打包、解包、压缩和解压指令输出重定向>和追加>>指令时间日期类搜索查找类用户管理文件所有者所在组权限管理变更权限crond任务时间调度crond相关指令&#xff1a;特殊符号说明&#xff1a; at定时任务磁盘分区磁盘…

作用域闭包

一、闭包的概念 当函数可以记住并访问所在的词法作用域时&#xff0c;就产生了闭包&#xff0c;即使函数时在当前词法作用域之外执行。 下面用一些代码来解释这个定义。 function foo(){var a 2;function bar() {console.log(a);}bar(); }foo();这段代码看起来和嵌套作用域…