类是 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

经验法则:成员变量一律 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[] 管理字符数组。做完你就彻底理解"类管理资源"这件事了。