C++中面向对象编程如何实现数据隐藏?
概念
在 C++ 中,面向对象编程(OOP)中的数据隐藏是指将对象的内部数据(成员变量)保护起来,只允许通过特定的公共接口(方法)去访问和修改这些数据。这种做法可以确保对象的状态保持一致,防止外部代码意外地修改对象的内部状态,并增加程序的安全性和可维护性。
数据隐藏的主要方法
使用访问修饰符
- C++ 提供了三种访问修饰符:private、protected 和 public。
- private 成员只能在类内部访问,外部无法直接访问。
- protected 成员可以在类及其派生类中访问,但在外部无法访问。
- public 成员可以在任何地方访问。
#include <iostream> class Account {
public: Account(double initial_balance) : balance(initial_balance) {} // 公共接口:存款方法 void deposit(double amount) { if (amount > 0) { balance += amount; } } // 公共接口:取款方法 void withdraw(double amount) { if (amount > 0 && amount <= balance) { balance -= amount; } } // 公共接口:获取账户余额 double getBalance() const { return balance; } private: double balance; // 私有成员,无法在类外直接访问
}; int main() { Account myAccount(100.0); // 创建一个 Account 对象 myAccount.deposit(50.0); // 存款 std::cout << "Balance after deposit: " << myAccount.getBalance() << std::endl; myAccount.withdraw(30.0); // 取款 std::cout << "Balance after withdrawal: " << myAccount.getBalance() << std::endl; // 下面的代码会导致编译错误,因为 balance 是私有的 // std::cout << "直接访问余额: " << myAccount.balance << std::endl; return 0;
}
输出
Balance after deposit: 150
Balance after withdrawal: 120
在这个示例中:
- balance 是一个私有变量,直接在 main 函数中访问该变量会产生编译错误。
- deposit、withdraw 和 getBalance 方法是公共接口,外部代码只能通过这些方法来操作账户余额。这就是一种数据隐藏的实现方式。
使用封装
- 封装是 OOP 的基本原则之一,意味着将数据(属性)和操作这些数据的方法(行为)组合在一起,封装在一个类中。通过封装,可以将对象的内部实现细节隐藏起来,我们可以控制外部对数据的访问,同时提供可靠的接口来与这些数据交互,这样的设计使得程序更加模块化、可维护和可靠。
- 封装的好处在于内聚性强,代码更易于管理,修改内部实现不会影响外部代码,只要公共接口不变。
#include <iostream>
#include <string> class Student {
private: std::string name; // 学生姓名 int age; // 学生年龄 std::string id; // 学生ID public: // 构造函数 Student(const std::string& name, int age, const std::string& id) : name(name), age(age), id(id) {} // 公共方法:获取学生姓名 std::string getName() const { return name; } // 公共方法:设置学生姓名 void setName(const std::string& newName) { name = newName; } // 公共方法:获取学生年龄 int getAge() const { return age; } // 公共方法:设置学生年龄 void setAge(int newAge) { if (newAge > 0) { // 只允许正数年龄 age = newAge; } else { std::cout << "Invalid age." << std::endl; } } // 公共方法:获取学生ID std::string getId() const { return id; } // 公共方法:设置学生ID void setId(const std::string& newId) { id = newId; } // 打印学生信息 void printInfo() const { std::cout << "Name: " << name << ", Age: " << age << ", ID: " << id << std::endl; }
}; int main() { // 创建学生对象 Student student1("Alice", 20, "S001"); // 打印学生信息 student1.printInfo(); // 修改学生姓名和年龄 student1.setName("Alice Cooper"); student1.setAge(21); // 打印更新后的学生信息 student1.printInfo(); // 尝试设置无效年龄 student1.setAge(-5); // 输出: Invalid age. return 0;
}
输出
Name: Alice, Age: 20, ID: S001
Name: Alice Cooper, Age: 21, ID: S001
Invalid age.
代码解析
1.私有数据成员:
- name、age、id 被声明为私有数据成员。这意味着这些属性只能通过类的公共方
法访问,而不能直接在 main 函数或其他外部代码中访问。
2.公共方法:
- getName()、setName()、getAge()、setAge()、getId()、setId() 和 printInfo() 是公共成员函数,它们提供了对私有数据的访问和修改。这些方法形成了一个安全的接口,通过这个接口,外部代码可以与 Student 对象进行交互。
3.数据验证:
- 在 setAge() 方法中,添加了一个简单的验证,以确保年龄的值为正数。这样可以防止对象处于不一致的状态。
4.构造函数:
- Student 类提供构造函数,方便创建对象时初始化学生的基本信息。
使用友元函数和友元类
- 如果需要某些特定的函数或类访问私有成员,可以通过友元机制实现。这使得特定的函数可以绕过访问控制,但这应谨慎使用,以免破坏数据隐藏的原则。
#include <iostream> class Account {
private: double balance; public: Account(double initial_balance) : balance(initial_balance) {} friend void displayBalance(const Account& account); // 声明友元函数
}; void displayBalance(const Account& account) { std::cout << "Account balance: " << account.balance << std::endl;
} int main() { Account myAccount(200.0); displayBalance(myAccount); // 友元函数可以访问私有成员 return 0;
}
输出
Account balance: 200
在这个示例中,displayBalance 是一个友元函数,友元函数是一个独立于类的函数,但它可以访问类的私有数据。也就是它可以访问 Account 类的私有成员 balance。
相关文章:
C++中面向对象编程如何实现数据隐藏?
概念 在 C 中,面向对象编程(OOP)中的数据隐藏是指将对象的内部数据(成员变量)保护起来,只允许通过特定的公共接口(方法)去访问和修改这些数据。这种做法可以确保对象的状态保持一致…...
使用 rbenv 切换 Ruby 版本
1. 查看当前 Ruby 版本 首先,查看当前系统中安装的 Ruby 版本: ruby -v如果你已经安装了 rbenv,可以列出通过 rbenv 安装的 Ruby 版本: rbenv versions2. 安装 Ruby 版本 如果你想安装新的 Ruby 版本,使用以下命令…...
6.4 CPU性能分析--Intel处理器跟踪技术
Intel处理器跟踪PT技术是记录程序执行过程的技术,它把记录信息编码报文存到高压缩率的二进制文件中。该二进制文件结合每条指令的时间戳重建执行流。PT技术覆盖度大,开销小,有关开销的信息详见,主要用于性能问题的事后分析和根因定…...
智能设备安全-固件逆向分析
固件逆向分析实验报告-20241022 使用固件常用逆向分析工具,对提供的固件进行文件系统提取,并记录逆向分析实验过程,提交实验报告(报告要求图文并茂,对涉及到的关键步骤附截图说明)。具体任务如下࿱…...
Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)
接上一篇:《Elasticsearch Java Api Client中DSL语句的查询方法汇总》 说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。 1、ScriptQuery方法 用途:它允许用户使用脚本(通常是 Painless 脚本语言…...
xshell连接虚拟机,更换网络模式:NAT->桥接模式
NAT模式:虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码,只要宿主机能够访问网络,虚拟机也能够访问。对外部网络而言,它看到的是宿主机的IP地址,而不是虚拟机的IP。但是,宿主机可…...
【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)
问题描述 根据操作手册正常拉取代码,然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…...
线上维修记录查询,让车辆保养更省心!
车辆保养对于每一位车主来说都是一个必不可少的环节,它不仅可以延长车辆的使用寿命,还能提高行车安全性。然而,相信很多人都有这样的经历:不知道自己的车辆什么时候进行过维修,也不清楚维修的内容和费用。这样一来&…...
【机器学习】基础知识:拟合度(Goodness of Fit)
拟合度概念及意义 拟合度(Goodness of Fit)是衡量统计模型对数据解释能力的指标,用于评价模型对观测数据的拟合效果。在回归分析、分类模型或其他预测模型中,拟合度是模型性能的重要衡量标准。 1. 拟合度的作用 拟合度的主要作用…...
排序算法(2)——快速排序
目录 1. 实现方式 1.1 霍尔法 1.2 挖坑法 1.3 前后指针法 2. 时间复杂度分析 3. 快速排序优化 3.1 三数取中 3.2 小区间使用插入排序 3.3 非递归实现 快速排序是英国计算机科学家托尼・霍尔(C. A. R. Hoare)在 1960 年年提出的一种二叉树结构…...
测试招工组,解决三个问题
所以我们今天的目标-----找工作! 那么我要找什么工作?如何能胜任这份工作?怎么让单位选择我?这是我们面临的三个问题。 一、我要找什么样的工作 解决这个问题,可以根据你当下已经掌握的能力,和毕业及工作…...
探索《Crypto Rumble》 游戏:经济模型篇
《Crypto Rumble》是一款基于 Zypher Network 游戏引擎打造的卡牌 RPG三消品类的 Web3 游戏,通过引人入胜的游戏设计以及轻量化的游戏玩法,《Crypto Rumble》不仅能够为玩家带来引人入胜的沉浸式游戏体验,同时基于 AI Bot 的游戏编辑器&#…...
《Python WEB安全 库全攻略》
《Python WEB安全 库全攻略》 一、引言二、Python WEB安全 库概述三、热门 Python WEB 安全库1. Flask-Security项目简介与功能:快速入门:使用场景与优势: 2. Flask-SeaSurf项目用途:项目特点:示例代码: 3.…...
DWA(一) —— 理论篇
1 DWA算法概述 DWA的原理:在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价,选取最优轨迹对应的(v,w)驱动机器人运动。 优点: (1)计算复杂度低:考虑到速度和加速度的限制,只有安全的轨迹会被考虑,且每次采…...
Ubuntu22.04搭建FTP服务器保姆级教程
在网络环境中,文件传输是一项至关重要的任务。FTP(文件传输协议)是一种基于客户端/服务器模式的协议,广泛用于在互联网上传输文件。Ubuntu作为一款流行的Linux发行版,因其稳定性和易用性而广受开发者和系统管理员的喜爱…...
微信小程序5-图片实现点击动作和动态加载同类数据
搜索 微信小程序 “动物觅踪” 观看效果 感谢阅读,初学小白,有错指正。 一、功能描述 a. 原本想通过按钮加载背景图片,来实现一个可以点击的搜索button,但是遇到两个难点,一是按钮大小调整不方便(网上搜索…...
leetcode 接雨水II(407)
题目: 给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输出: 4 解释: 下雨后,雨水…...
使用 ESP32 构建倒车雷达系统:蜂鸣器警报功能详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:趣享先生的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏&…...
Cesium中实现仿ArcGIS三维的动态图层加载方式
Cesium 加载 ArcGIS 动态图层的方式 如果你在 Cesium 中加载过 ArcGIS 的动态图层,你会发现,Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。 这样会造成一些问题: 请求量大,…...
国际荐酒师(香港)协会亮相第六届地博会助力中欧地标交流合作
国际荐酒师(香港)协会亮相第六届知交会暨地博会,助力中欧地理标志产品交流合作 12月9日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会(以下简称“第六届知交会暨地博会”)在中新广州…...
java八股-索引下推(图解对比)
参考链接 https://xiaolincoding.com/mysql/base/how_select.html#%E6%89%A7%E8%A1%8C%E5%99%A8 https://javaguide.cn/database/mysql/mysql-index.html#%E7%B4%A2%E5%BC%95%E4%B8%8B%E6%8E%A8 如何理解索引下推这个概念,其实就是index把Server层的工作࿰…...
自荐一部IT方案架构师回忆录
作者本人毕业于一个不知名大专院校,所读专业计算机科学技术。2009年开始IT职业生涯,至今工作15年。擅长TSQL/Shell/linux等技术,曾经就职于超万人大型集团、国内顶级云厂商、央国企公司。参与过运营商大数据平台、大型智慧城市ICT、云计算、人…...
C语言理解 —— 实用的字符串函数
目 录 字符串函数的头文件strlenstrstrstrncpystrncmp 字符串函数的头文件 #include <string.h>strlen 计算字符串长度的,从字符的首地址开始遍历,以 ‘\0’ 为结束标志,然后将计算的长度返回,但是计算的长度不包含’\0’…...
“Python-OpenCV初体验:简单实现颜色识别与轮廓绘制”
一、引言 图像处理技术在现代科技中扮演着重要角色,但对于初学者来说,掌握这些技术可能显得有些复杂。在这篇博客中,我们将带你一步步了解如何利用Python和OpenCV来识别图像中的颜色并绘制轮廓。通过简明的实验原理和代码示例,你…...
导游现场面试需要注意的问题
今天给大家带来一些导游现场面试需要注意的问题,大部分的城市导游考试已经考完了,但是还有一些城市的十二月份才考,有需要的朋友们赶紧来看,有备无患。 01、做好充足准备 认真准备做好每个景点的讲解介绍,不要抱有侥幸…...
JDK8新特性:Stream
JDK8最大的改变: 1. lambda表达式 2. Stream 1. Steam流的入门 什么是Stream? 也叫Stream流,是jdk8开始的一套API,用于操作集合或者数组中的数据 优点: Stream流大量结合了Lambda的语法风格来创建,提…...
CSS的2D和3D动画效果
CSS的2D和3D动画效果:网页动态设计的魔法 在现代网页设计中,动画已经成为提升用户体验的重要元素。通过引入动态效果,我们不仅可以使交互更加流畅和直观,还能吸引用户的注意力,增强品牌认知度。CSS提供了强大的工具&a…...
OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数,用于将点从齐次坐标(homogeneous coordinates)…...
动态流程图制作方法
动态流程图制作方法 1.方法1 有各种 echars模板 可以自己改代码 https://www.isqqw.com/viewer?id42201echars 在线生成 https://codevtool.com/echarts2. 方法2电脑软件,画图的。 《亿图图示》...
【pytroch】线性回归
构造一个PyTorch数据迭代器 def load_array(data_arrays, batch_size, is_trainTrue): #save"""构造一个PyTorch数据迭代器"""dataset data.TensorDataset(*data_arrays)return data.DataLoader(dataset, batch_size, shuffleis_train)batch_…...
前端请求后端接口报错(blockedmixed-content),以及解决办法
报错原因:被浏览器拦截了,因为接口地址不是https的。 什么是混合内容(Mixed Content) 混合内容是指在同一页面中同时包含安全(HTTPS)和非安全(HTTP)资源的情况。当浏览器试图加载非…...
基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理
基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…...
Pull requests 和Merge Request其实是一个意思
Pull requests的定义 在Git中,PR(Pull Request)是一种协作开发的常用方式。它允许开发者将自己的代码变更(通常是一个分支)提交到项目的仓库中,然后请求负责代码审查的人员将这些变更合并到主分支中。通过…...
网络原理03
回顾 应用层:应用程序,数据具体如何使用 传输层:关注起点和终点 网络层:关注路径规划 数据链路层:关注相邻节点的转发 物理层:硬件设备 应用层 应用程序 在应用层,很多时候,…...
yarn 安装问题
Couldn’t find package “regenerator-runtime” on the “npm” registry. Error: Couldn’t find package “watch-size” on the “npm” regist 标题Error: Couldn’t find package “babel-helper-vue-jsx-merge-props” on the “npm” registry. Error: Couldn’t f…...
优选算法——分治(快排)
1. 颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) 题目展示: 题目分析:本题其实就要将数组最终分成3块儿,这也是后面快排的优化思路,具体大家来看下图。 这里我们上来先定义了3个指针&…...
深入解析强化学习中的 Generalized Advantage Estimation (GAE)
中文版 深入解析强化学习中的 Generalized Advantage Estimation (GAE) 1. 什么是 Generalized Advantage Estimation (GAE)? 在强化学习中,计算策略梯度的关键在于 优势函数(Advantage Function) 的设计。优势函数 ( A ( s , a ) A(s, a…...
PostgreSQL/PostGIS中提升空间查询(分析)性能(效率)的一些方法
目录 1. 使用适当的索引 1.1 索引类型 1.2 分析查询计划 1.3 覆盖索引 1.4 复合索引 1.5 维护索引 1.6 删除不必要的索引 1.7 使用适当的数据类型 2. 建立分区表 2.1 分区表的基本概念 2.2 创建分区表的步骤 2.3 空间数据的分区 2.4 分区表优点 3. 简化几何形状 …...
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球最受欢迎的Web服务器软件,支持约30.2%的所有活跃网站。凭借其可靠性、灵活性和强大的功能,Apache数十年来一直是互联网的中坚力量。 一、Apache Web服务器的工作原理 Apache Web服务器的工作原理如下: 接收HTTP请求࿱…...
攻防世界Reversing-x64Elf-100
一、使用Exeinfo PE 查壳 64无壳 二、使用IDA静态分析 1.找main 总览分析到:要使sub_4006FD出0,就可以得到"Nice!" 2.找到关键函数sub_4006FD 总览分析:v3是二维数组,要使if( )里的值1,就可以出0 分析if(…...
MySQL生产环境备份脚本
全量备份脚本,其中BakDir,ZlbakDir,LogFile需要自己创建 #!/bin/bash export LANGen_US.UTF-8# 指定备份目录 BakDir/root/beifen/data/mysqlbak/data/allbak # 指定增量备份目录 ZlbakDir/root/beifen/data/mysqlbak/data/zlbak # 备份日志…...
redis 怎么样删除list
在 Redis 中,可以使用以下方法删除列表或列表中的元素: 1. 删除整个列表 使用 DEL 命令删除一个列表键: DEL mylist这个命令会删除键 mylist 及其值(无论 mylist 是一个列表还是其他类型的键)。 2. 删除列表中的部分…...
uniapp小程序 slot中无法传递外部参数的解决方案
最近在封装一个List组件,外部传给我数据,我循环后将每个Item部分slot到外部,由调用者自己去写item布局,类似ElementUI、iView的Tabe列表。 List: <view v-if"list.length > 0" class"list-scroll__item&quo…...
Java面试之实现多线程(二)
此篇接上一篇Java面试之什么是多线程(一) Java多线程是Java语言中的一个重要特性,它可以实现并发处理、提高程序的性能和响应能力。开发者需要了解多线程的概念和机制,并采用合适的多线程编程模型和同步机制,以保证程序的正确性和稳定性。Jav…...
论文笔记:Treat Visual Tokens as Text? But Your MLLM Only Needs Fewer Efforts to See
2024 10月的arxiv 1 主要idea 针对多模态大模型(如LLaVA),提出了一系列高效的剪枝策略 在显著降低计算开销(多达 88%)的同时,保持了模型在多模态任务中的性能表现 2 目前的问题 与文本 token 相比&…...
HDOJ 1735:字数统计 ← 贪心
【题目来源】https://acm.hdu.edu.cn/showproblem.php?pid1735【题目描述】 一天,淘气的 Tom 不小心将水泼到了他哥哥 Jerry 刚完成的作文上。原本崭新的作文纸顿时变得皱巴巴的,更糟糕的是由于水的关系,许多字都看不清了。可怜的 Tom 知道他…...
Java常用类(完整版)
其他类 Object类 超类、基类,所有类的直接或间接父类,位于继承树的最高层 任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类 Object类中所定义的方法,是所有对象都具备的方法 Object类型可以存储…...
【JAVA】Java项目实战—Java SE进阶项目:在线考试系统
在数字化教育中,在线考试系统的需求日益增加。它不仅提高了考试的效率,还能方便学生随时随地进行学习和测试。Java作为一种强大的编程语言,因其平台无关性、丰富的类库和强大的社区支持,成为开发在线考试系统的理想选择。 在线考…...
仿iOS日历、飞书日历、Google日历的日模式
仿iOS日历、飞书日历、Google日历的日模式,24H内事件可自由上下拖动、自由拉伸。 以下是效果图: 具体实现比较简单,代码如下: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;…...
机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法
引言 大模型(如BERT、GPT等)在自然语言处理任务中展现了强大的能力,但为了使其更贴合特定应用场景,通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据,并通过具体…...