1. 从结构体到类的跨越
在C语言中,结构体(struct)是我们组织数据的利器,但到了C++中,类(class)的出现彻底改变了我们编程的方式。记得我第一次从C转向C++时,最震撼的就是发现结构体突然"活"了起来——它们不仅能存储数据,还能自己干活了!
cpp复制// C风格的结构体
struct Point {
int x;
int y;
};
// C++中的类
class Point {
public:
void move(int dx, int dy) {
x += dx;
y += dy;
}
private:
int x;
int y;
};
这个简单的Point类已经展示了面向对象编程的核心思想:封装。我们把数据(x,y)和操作这些数据的方法(move)打包在一起,形成一个自包含的"黑盒子"。在实际项目中,这种封装带来的好处是巨大的:
- 数据保护:通过private关键字,我们可以隐藏内部实现细节,防止外部代码随意修改关键数据
- 接口稳定:即使内部实现改变(比如改用极坐标存储点),只要公有接口不变,使用这个类的代码就不需要修改
- 职责明确:每个类都有清晰的职责边界,代码组织更合理
提示:刚开始使用类时,最容易犯的错误是把所有成员都设为public。记住一个原则:除非有充分理由,否则成员变量都应该设为private。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 构造函数与对象初始化
构造函数是类中最重要的特殊成员函数之一。它决定了对象如何诞生,也直接影响代码的健壮性。我曾经在一个项目中追踪了整整两天的bug,最后发现只是因为一个类没有正确初始化成员变量。
2.1 构造函数的多种形式
cpp复制class Student {
public:
// 默认构造函数
Student() : id(0), name(""), score(0.0) {}
// 带参数的构造函数
Student(int i, string n, double s) : id(i), name(n), score(s) {}
// 委托构造函数(C++11)
Student(int i) : Student(i, "", 0.0) {}
// 拷贝构造函数
Student(const Student& other)
: id(other.id), name(other.name), score(other.score) {}
private:
int id;
string name;
double score;
};
每种构造函数都有其特定用途:
- 默认构造函数:创建对象时不提供任何参数
- 带参构造函数:创建时直接初始化
- 委托构造函数:避免重复代码
- 拷贝构造函数:用一个已有对象初始化新对象
2.2 初始化列表的重要性
构造函数后的冒号和初始化列表
