1. 面向对象编程与C++的核心概念回顾
面向对象编程(OOP)是现代软件开发中最重要的编程范式之一,而C++作为其典型代表语言,融合了高效的系统级编程能力与丰富的面向对象特性。在实际工程中,掌握OOP思想比单纯记忆语法更为关键。以下是C++面向对象编程中必须牢固掌握的五个核心概念:
封装:这是OOP的第一道防线。在C++中通过class关键字实现,将数据成员声明为private``protected,通过公有成员函数提供访问接口。好的封装就像设计精密的仪器仪表盘——用户只需知道按钮功能,无需了解内部电路。例如银行账户类应该隐藏余额数据,只提供deposit()和withdraw()等安全操作方法。
继承:实现代码复用的利器。C++支持单继承和多继承(需谨慎使用),通过:符号建立派生关系。继承体系设计就像组织架构图——Employee作为基类,Manager和Developer作为派生类,各自扩展专属属性和方法。注意区分public、protected和private继承对成员可见性的影响。
多态:OOP最强大的特性之一。在C++中通过虚函数机制实现,使用virtual关键字声明基类函数,派生类通过override重写。就像游戏中的技能系统——基类Character定义virtual void attack(),不同职业角色实现各自攻击逻辑,通过基类指针调用时自动匹配实际对象类型。
抽象:通过纯虚函数(=0语法)创建抽象基类,强制派生类实现特定接口。这类似于电器插座标准——抽象类定义插头规格,具体设备实现供电细节。C++没有interface关键字,但可以用全部由纯虚函数组成的类模拟接口。
内存管理:C++的特色与难点。new/delete需要配对使用,现代C++更推荐智能指针(unique_ptr、shared_ptr)。就像工地施工——手动管理如同亲自搬运建材,而智能指针就像专业的物流团队,自动处理材料调度和清理。
关键技巧:在Visual Studio Code中配置C++环境时,建议安装CMake Tools和C/C++扩展,使用
tasks.json定义编译任务。对于面向对象项目,合理规划.h头文件和.cpp实现文件的组织结构至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++面向对象编程10大核心练习题
2.1 类与对象基础
题目1:银行账户系统
实现BankAccount类,包含:
private成员:账号(string)、余额(double)public方法:构造函数(初始化账号)、deposit(amount)、withdraw(amount)、getBalance()- 添加静态成员
totalAccounts统计创建的账户总数
cpp复制class BankAccount {
private:
std::string accountNumber;
double balance;
static int totalAccounts;
public:
BankAccount(const std::string& accNum)
: accountNumber(accNum), balance(0.0) {
totalAccounts++;
}
void deposit(double amount) {
if (amount > 0) balance += amount;
}
bool withdraw(double amount) {
if (amount > 0 && balance >= amount) {
balance -= amount;
return true;
}
return false;
}
double getBalance() const { return balance; }
static int getTotalAccounts() { return totalAccounts; }
};
int BankAccount::totalAccounts = 0;
常见问题:
- 忘记在类外初始化静态成员会导致链接错误
- 取款操作应检查余额是否充足,最好返回操作结果
- 金额操作需要验证正数,避免负数导致逻辑错误
2.2 继承与多态实战
题目2:图形计算系统
设计基类Shape,派生Circle和Rectangle:
Shape包含纯虚函数area()和perimeter()Circle需实现半径属性和计算逻辑Rectangle需实现长宽属性和计算逻辑- 使用基类指针数组存储不同图形,统一计算总面积
cpp复制class Shape {
public:
virtual double area() const = 0;
virtual double perimeter() const = 0;
virtual ~Shape() {} // 基类析构函数应为虚函数
};
class Circle : public Shape {
double radius;
public:
Circle(do
