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

C/C++基础知识复习(45)

1) C++ 中面向对象编程如何实现数据隐藏?

在 C++ 中,数据隐藏是通过将类的成员变量和方法的访问权限控制起来实现的。通常,数据隐藏是通过使用 访问控制 机制来实现的,C++ 提供了三种访问控制修饰符:

  • private: 使成员变量和成员函数只能在类的内部访问,外部无法直接访问。这是实现数据隐藏的主要方式。
  • protected: 使成员变量和成员函数在当前类和派生类中可以访问,但外部代码无法访问。
  • public: 使成员变量和成员函数可以被类的外部直接访问。

通过将类的内部数据(如成员变量)声明为 privateprotected,并通过 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 是私有的,外部无法直接访问。通过 depositwithdrawgetBalance 等公有函数来访问和修改 balance,这样就隐藏了类的实现细节,防止了外部直接修改余额的风险。

2) C++ 中面向对象编程如何处理异常?

C++ 使用 异常处理机制(Exception Handling)来处理程序运行过程中可能出现的错误。异常机制通过 trythrowcatch 语句实现。

  • 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; 
}
关键点:
  1. 异常抛出:当 withdraw 方法检测到余额不足时,抛出了 InsufficientFundsException 异常。
  2. 异常捕获:使用 catch 块捕获特定的异常类型。可以根据不同的异常类型执行不同的处理逻辑。
  3. 标准异常类:C++ 标准库提供了许多预定义的异常类,如 std::invalid_argumentstd::out_of_rangestd::runtime_error 等,通常会继承自 std::exception

总结:

  • 数据隐藏:通过使用 privateprotected 访问修饰符,并通过 public 方法进行数据访问和操作来实现。
  • 异常处理:通过 trythrowcatch 来处理异常,能够捕获并处理程序中的错误。可以使用标准异常类或自定义异常类来表达不同的错误情况。

http://www.mrgr.cn/news/81296.html

相关文章:

  • 运动控制卡网络通讯的心跳检测之C#上位机编程
  • 【数学】向量范数和矩阵范数
  • C++之“流”-第5课.三军联动:流 +操作符+函数重载
  • 第一部分:mybatisPlus
  • Windbg常用命令
  • 2025.01.15python商业数据分析top2
  • 修炼内功之函数栈帧的创建与销毁
  • 活着就好20241224
  • 守护爱犬健康:狗狗必打三针之解析
  • 【蓝桥杯——物联网设计与开发】基础模块8 - RTC
  • Linux字符设备驱动开发的三种方式(分析+对比+示例)
  • C++学习记录--b站黑马程序员视频——55 类和对象-多态-案例1-计算器类
  • Python(第一天)
  • 结合实例从HCI层分析经典蓝牙连接和鉴权过程
  • Vue3中路由跳转之后删除携带的query参数
  • 蓝牙协议——音乐启停控制
  • 深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CBN)
  • 类设计者的核查表
  • 耗时半月,终于把牛客网上的软件测试面试八股文整理成了PDF合集(测试基础+linux+MySQL+接口测试+自动化测试+测试框架+jmeter测试+测试开发)
  • shiro权限校验demo
  • 高并发处理 --- Caffeine内存缓存库
  • 图解JVM整体结构、执行流程以及2种架构模型,你学会了吗?
  • 绕组识别标签规范
  • 【基于rust-wasm的前端页面转pdf组件和示例】
  • 蓝牙协议——音量控制
  • Django 管理命令中使用 `logging` 和 输出样式