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
来处理异常,能够捕获并处理程序中的错误。可以使用标准异常类或自定义异常类来表达不同的错误情况。