C/C++基础知识复习(45)
1) C++ 中面向对象编程如何实现数据隐藏?
在 C++ 中,数据隐藏是通过将类的成员变量和方法的访问权限控制起来实现的。通常,数据隐藏是通过使用 访问控制 机制来实现的,C++ 提供了三种访问控制修饰符:
- private: 使成员变量和成员函数只能在类的内部访问,外部无法直接访问。这是实现数据隐藏的主要方式。
- protected: 使成员变量和成员函数在当前类和派生类中可以访问,但外部代码无法访问。
- public: 使成员变量和成员函数可以被类的外部直接访问。
通过将类的内部数据(如成员变量)声明为 private 或 protected,并通过 public 成员函数来提供对这些数据的间接访问,我们可以有效地隐藏类的内部实现细节,从而实现数据封装和数据隐藏。
示例代码:
#include <iostream>
using namespace std;
class Account {
private: double balance; // 余额是私有的,外部无法直接访问
public: // 构造函数 Account(double initial_balance) {
if (initial_balance >= 0) {
balance = initial_balance;
}
else {
balance = 0;
cout << "Initial balance must be positive." << endl;
} } // 提供公共方法来访问和修改余额
void deposit(double amount) {
if (amount > 0) {
balance += amount;
} }
void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
} else {
cout << "Invalid withdrawal amount." << endl;
} }
double getBalance() const {
return balance;
} };
int main() {
Account myAccount(1000);
myAccount.deposit(500);
cout << "Balance: " << myAccount.getBalance() << endl;
myAccount.withdraw(300);
cout << "Balance after withdrawal: " << myAccount.getBalance() << endl; return 0;
}
在上面的例子中,balance 是私有的,外部无法直接访问。通过 deposit、withdraw 和 getBalance 等公有函数来访问和修改 balance,这样就隐藏了类的实现细节,防止了外部直接修改余额的风险。
2) C++ 中面向对象编程如何处理异常?
C++ 使用 异常处理机制(Exception Handling)来处理程序运行过程中可能出现的错误。异常机制通过 try、throw 和 catch 语句实现。
try块:包含可能抛出异常的代码。throw语句:用于抛出异常。catch块:捕获并处理异常。
在面向对象编程中,异常处理通常涉及到抛出和捕获自定义的异常类。C++ 允许开发者定义自己的异常类型,并且可以通过继承标准异常类(如 std::exception)来创建特定类型的异常。
示例代码:
#include <iostream>
#include <stdexcept> // 引入标准异常类
using namespace std;
// 自定义异常类
class InsufficientFundsException : public exception {
public: const char* what() const noexcept override {
return "Insufficient funds in the account!";
} };
class Account {
private: double balance;
public: Account(double initial_balance) {
if (initial_balance < 0) {
throw invalid_argument("Initial balance cannot be negative.");
}
balance = initial_balance;
}
void deposit(double amount) {
if (amount <= 0) { throw invalid_argument("Deposit amount must be positive.");
}
balance += amount;
}
void withdraw(double amount) {
if (amount > balance) {
throw InsufficientFundsException(); // 抛出自定义异常
}
balance -= amount;
}
double getBalance() const {
return balance; } }; int main() {
try { Account myAccount(500); myAccount.deposit(200);
myAccount.withdraw(800); // 这将抛出异常
}
catch (const InsufficientFundsException& e) {
cout << "Error: " << e.what() << endl; } catch (const exception& e) {
cout << "Standard Exception: " << e.what() << endl;
}
catch (...) {
cout << "Unknown exception occurred." << endl; } return 0;
}
关键点:
- 异常抛出:当
withdraw方法检测到余额不足时,抛出了InsufficientFundsException异常。 - 异常捕获:使用
catch块捕获特定的异常类型。可以根据不同的异常类型执行不同的处理逻辑。 - 标准异常类:C++ 标准库提供了许多预定义的异常类,如
std::invalid_argument、std::out_of_range、std::runtime_error等,通常会继承自std::exception。
总结:
- 数据隐藏:通过使用
private或protected访问修饰符,并通过public方法进行数据访问和操作来实现。 - 异常处理:通过
try、throw和catch来处理异常,能够捕获并处理程序中的错误。可以使用标准异常类或自定义异常类来表达不同的错误情况。
相关文章:
C/C++基础知识复习(45)
1) C 中面向对象编程如何实现数据隐藏? 在 C 中,数据隐藏是通过将类的成员变量和方法的访问权限控制起来实现的。通常,数据隐藏是通过使用 访问控制 机制来实现的,C 提供了三种访问控制修饰符: private: 使成员变量和…...
现代C++锁介绍
文章目录 场景描述🐞 初始实现: 非线程安全版本互斥锁: std::mutex使用mutex保护共享资源使用std::lock_guard简化锁的管理 优化读操作: std::shared_mutex多个锁的管理: std::scoped_lock使用std::scoped_lock避免死锁 其他高级锁⏳ 带超时的锁: std::timed_mutex使…...
Squid代理服务器的安装使用
1.简介 Squid代理服务器是一种高效的中间服务器,位于客户端和目标服务器之间,起到了重要的网络中介作用。以下是对Squid代理服务器的详细介绍: 一、功能特点 缓存功能: Squid可以缓存经过它的请求和响应数据。当客户端发起请求时…...
爬虫学习案例8
爬取京东评论信息 采用DrissionPage自动化工具采集,感觉比Selenium工具好,真香。 安装第三方库 pip install DrissionPage pip install pandas pip install pyecharts pip install jieba pip install wordcloud1.安装DrissionPage库 DrissionPage安装…...
深入了解 CouchDB 的 Mango 查询:操作符和限制
CouchDB 是一个基于文档的数据库管理系统,支持 HTTP 协议,拥有强大的同步机制和灵活的数据模型。Mango 查询是 CouchDB 中用于数据检索的现代化查询接口,灵感来自 MongoDB 的查询语法。本文将深入探讨 Mango 查询中的各种操作符和限制,并提供详细的例子和说明,帮助你更好地…...
基于SSM(Spring + Spring MVC + MyBatis)框架搭建一个病人跟踪信息管理系统
基于SSM(Spring Spring MVC MyBatis)框架搭建一个病人治疗跟踪信息系统是一个相对复杂的项目,涉及到多个模块和功能。以下是一个简要的指导步骤。 1. 环境准备 开发环境:确保安装了Java Development Kit (JDK),建议…...
U盘文件名变乱码:原因、恢复与预防全解析
一、U盘文件名变乱码现象描述 在日常使用U盘进行数据传输和存储时,我们有时会遇到一个令人头疼的问题:U盘中的文件名突然变成了乱码,无法正常识别或访问。这些乱码文件名可能包含各种奇怪的字符和符号,使得原本有序的文件管理变得…...
EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南
随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台,作为基于国标GB28181协议的视频流媒体平台,为用户提供了强大的视频监控直播功能。然而,在实际应用中,P2P远程访问可…...
一网多平面
“一网多平面”是一种网络架构概念,具体指的是在一张物理网络之上,逻辑划分出“1N”个平面。以下是对“一网多平面”的详细解释: 定义与构成 01一网多平面 指的是在统一的物理网络基础设施上,通过逻辑划分形成多个独立的网络平面…...
animatediff 模型网盘分享
网盘 一、123网盘,不限速 https://www.123pan.com/s/ueQ8jv-OlzPh.html 网盘 网址 animatediff 国外网址https://huggingface.co/guoyww/animatediff/tree/cd71ae134a27ec6008b968d6419952b0c0494cf2 国内镜像在 https://hf-mirror.com/guoyww/animatediff/t…...
ansible play-book玩法
使用ansible-playbook实现安装nginx_ansible 安装nginx-CSDN博客文章浏览阅读1.5k次,点赞14次,收藏19次。本文详细介绍了如何在Linux环境中准备Ansible环境,包括配置主机、下载和安装Ansible,以及使用yum模块和tar包源码安装Nginx…...
MySQL索引-索引的分类和创建
索引类型 数据类型 B树索引Hash索引FullText全文索引 物理存储 聚簇索引二级索引 字段特性 主键索引唯一索引普通索引前缀索引 字段个数 单列索引联合索引 创建索引 创建表时一同创建创建表后单独创建创建表后通过修改表结构创建 可以通过 SHOW INDEX FROM test_table;查看…...
如何给负载均衡平台做好安全防御
在现代网络架构中,负载均衡(Load Balancing)扮演着至关重要的角色。它不仅负责将流量分配到多个服务器以确保高效的服务交付,还作为第一道防线来抵御外部攻击。为了保护您的应用程序和服务免受潜在威胁,必须对负载均衡…...
HR/TA/HRBP的关系
HR(人力资源)领域包含 TA(人才获取)和 HRBP(人力资源业务伙伴)这两个重要的角色,但它们只是 HR 工作的一部分分支,一般我们说的HR指TA。 1. 人才获取(TA) 定…...
Docker环境下MySQL数据库持久化部署全攻略
概述 在当今的软件开发领域,Docker容器技术已经成为应用部署和管理的新标准。它不仅简化了应用的部署流程,还为数据管理提供了灵活的解决方案。特别是在涉及到MySQL数据库时,数据持久化是一个不可忽视的重要环节。本文将分享如何在Docker中部…...
如何查看pad的console输出,以便我们更好的进行调试,查看并了解实际可能的问题。
1、以下是baidu AI回复: 2、说明: 1)如果小伙伴们经常做android开发的话,这个不陌生,因为调试都是要开启这个开发者模式。并启用USB调试模式。 2)需要连上USB线,有的时候会忘记,然…...
react中使用ResizeObserver来观察元素的size变化
在 React 中使用 ResizeObserver 来观察元素的大小变化,可以通过创建一个自定义 Hook 来封装 ResizeObserver 的逻辑,并在组件中使用这个 Hook。以下是一个完整的示例,展示了如何在 React 中使用 ResizeObserver 来观察元素的大小变化。 自定…...
Linux快速入门-Linux文件系统管理
Linux文件系统管理 1. Linux文件系统概述1.1 文件系统概念1.2 用户权限差异1.3 文件命名规范 2. Linux文件系统分类及特点2.1 ext2(第二扩展文件系统)2.2 ext3(第三扩展文件系统)2.3 ext4(第四扩展文件系统)…...
漏洞检测工具:Swagger UI敏感信息泄露
Swagger UI敏感信息泄露 漏洞定义 Swagger UI是一个交互式的、可视化的RESTful API文档工具,它允许开发人员快速浏览、测试API接口。Swagger UI通过读取由Swagger(也称为OpenAPI)规范定义的API描述文件(如swagger.json或swagger…...
VSCode如何修改默认扩展路径和用户文件夹目录到D盘
在使用Visual Studio Code(VSCode)时,随着安装的扩展和用户数据的增多,C盘的空间可能会逐渐紧张。为了优化存储管理,将VSCode的默认扩展路径和用户文件夹目录迁移到D盘是一个有效的解决方案。以下是详细的操作步骤&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
