1. 从C到C++:面向对象编程的思维转变
在C语言的世界里,我们习惯用面向过程的思维方式解决问题——把问题分解成一系列步骤,通过函数调用来实现。这种思维方式在处理简单问题时非常直观,但随着系统复杂度提升,维护成本会急剧增加。来看一个典型例子:
c复制// C语言实现栈操作
void push(struct Stack* s, int val) {
if (s->top == s->capacity) {
// 扩容逻辑
}
s->data[s->top++] = val;
}
C++引入了面向对象编程范式,将数据和对数据的操作封装在一起。同样的栈操作在C++中会是这样:
cpp复制class Stack {
public:
void Push(int val) {
if (_top == _capacity) {
// 扩容逻辑
}
_data[_top++] = val;
}
private:
int* _data;
int _top;
int _capacity;
};
这种封装带来的最直接好处是:调用时不再需要显式传递结构体指针,所有操作都通过对象自动完成。编译器在背后帮我们处理了this指针的传递,代码更简洁且不易出错。
关键区别:C语言中数据和操作分离,C++中将相关数据和操作绑定在同一个类中,形成更紧密的封装单元。
2. 类的定义与实现细节
2.1 从结构体到类的演进
C++中的类可以看作是C结构体的增强版。在C中,结构体只能包含数据成员:
c复制struct Point {
int x;
int y;
};
而在C++中,结构体可以包含成员函数(方法),实际上C++中的struct和class几乎相同,唯一的区别是默认访问权限:
cpp复制struct Point { // 默认public
void Move(int dx, int dy) {
x += dx;
y += dy;
}
int x;
int y;
};
class
