1. 从C到C++:面向对象编程的核心转变
作为一名从C语言转向C++开发的程序员,我深刻体会到类与对象概念带来的编程范式变革。在C语言中,我们习惯用结构体存储数据,用独立函数操作这些数据。而C++通过类机制,将数据与操作紧密绑定,实现了真正的封装。
让我们从一个简单例子开始理解这种转变。假设我们需要处理矩形数据:
cpp复制// C语言风格
struct Rectangle {
double length;
double width;
};
double calculateArea(struct Rectangle r) {
return r.length * r.width;
}
// C++风格
class Rectangle {
private:
double length;
double width;
public:
Rectangle(double l, double w) : length(l), width(w) {}
double area() { return length * width; }
};
在C++中,数据(length/width)和操作(area())被封装在同一个类中,不再需要像C语言那样定义独立函数。这种封装性带来了几个显著优势:
- 数据保护:通过private关键字可以隐藏内部实现细节
- 接口统一:所有相关操作都通过类方法提供
- 对象自治:每个对象都包含自己的状态和行为
关键理解:类就像是一个"智能结构体",它不仅知道如何存储数据,还知道如何处理这些数据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 类的基本结构与访问控制
2.1 类的组成要素
一个完整的C++类通常包含以下部分:
cpp复制class ClassName {
private:
// 私有成员(数据+函数)
protected:
// 保护成员
public:
// 公有接口
// 构造函数
// 成员函数
};
访问控制是类的核心特性之一,它决定了哪些成员可以被外部访问:
- private:仅限类内部使用(默认)
- protected:类内部和派生类可用
- public:完全开放接口
2.2 访问控制的实际应用
考虑一个银行账户类的设计:
cpp复制class BankAccount {
private:
std::string accountNumber;
double balance;
void logTransaction(const std::string& type, double amount) {
// 记录交易日志
}
public:
BankAccount(const std::string& accNo, double initBalance)
: accountNumber(accNo), balance(initBalance) {}
void deposit(double amount) {
balance += amount;
logTransaction("Deposit", amount);
}
bool withdraw(double amount) {
if(amount > balance) return false;
balance -= amount;
logTransaction("Withdraw", amount);
return true;
}
double getBalance() const { return balance; }
};
在这个设计中:
- 账户号和余额设为private,防止外部直接修改
- 交易日志函数也是private,属于内部实现细节
- 存款、取款和查询余额
