类是 C++ 面向对象编程的基石:它把数据和对数据的操作打包在一起,并通过访问控制保护内部状态。理解类与对象,就等于理解了"类型"可以如何被自己定义——这比 C 的 struct 前进了一大步。
1. 从 struct 到 class
C 的 struct 只能装数据,C++ 的 class 还能装函数,并且默认私有访问:
class BankAccount {
double balance; // 默认 private
public:
void deposit(double m) { balance += m; }
double get_balance() const { return balance; }
};
把 class 换成 struct 语法完全兼容,只是默认访问级别变为 public——所以很多人把 struct 当"纯数据"用。
2. 构造函数与析构函数
构造函数在对象创建时初始化成员,析构函数在对象销毁时释放资源,二者成对出现:
#include <iostream>
using namespace std;
class Counter {
int count;
public:
Counter(int n = 0) : count(n) { // 构造函数(带默认参数)
cout << "构造,count = " << count << endl;
}
~Counter() { // 析构函数
cout << "析构,count = " << count << endl;
}
void inc() { ++count; }
};
int main() {
Counter c(5); // 输出"构造"
c.inc();
return 0; // 离开作用域时自动调用析构
}
3. 访问控制:public / private / protected
- public:任何人都能访问,类对外的接口。
- private:只有类自己的成员函数能访问,数据保护的默认选择。
- protected:private 基础上放行子类,供继承使用。
经验法则:成员变量一律 private,通过 getter/setter 暴露访问,这样以后改内部实现不影响外部代码。
4. this 指针与成员函数
每个成员函数都隐含一个 this 指针,指向调用它的对象。参数与成员同名时用它区分:
class Point {
int x, y;
public:
void set(int x, int y) {
this->x = x; // 左边是成员,右边是参数
this->y = y;
}
};
函数末尾的 const(如 get_balance() const)表示该函数不修改成员,是"只读操作"的承诺。
5. 初始化列表
在函数体里赋值是"先默认构造、再赋值";初始化列表是"直接构造",更高效,而且是 const 成员唯一能初始化的地方:
class Student {
const int id; // const 成员只能初始化列表赋值
string name;
public:
Student(int i, string n) : id(i), name(n) {}
};
6. 对象数组与容器
对象放进 vector 是最常见的组合,注意拷贝会触发拷贝构造:
#include <vector>
vector<Counter> v;
v.reserve(3); // 预分配,避免反复拷贝
v.emplace_back(1); // 直接构造,比 push_back 少一次拷贝
v.emplace_back(2);
v.emplace_back(3);
💡 动手题:实现一个String类,包含构造函数、析构函数、拷贝构造和length(),用new[]/delete[]管理字符数组。做完你就彻底理解"类管理资源"这件事了。