Z
ZHANK
面向对象

构造与析构

构造函数重载、初始化列表、析构函数、拷贝构造、=delete

构造与析构

构造函数负责"出生"(初始化),析构函数负责"死亡"(清理)。C++ 会自动生成几个特殊函数,理解它们可以避免隐蔽的 bug。

学完本章你将: 掌握构造重载、初始化列表、析构、拷贝/移动控制、=default/=delete。


构造函数

cpp
#include <iostream>
#include <string>

class Person {
    std::string name;
    int age;
public:
    // 默认构造
    Person() : name("未知"), age(0) {
        std::cout << "默认构造\n";
    }

    // 带参数构造(初始化列表,比在函数体内赋值高效)
    Person(const std::string &n, int a) : name(n), age(a) {
        std::cout << "有参构造\n";
    }

    // 析构函数
    ~Person() {
        std::cout << name << " 被销毁\n";
    }

    void print() const {
        std::cout << name << "," << age << " 岁\n";
    }
};

int main() {
    Person p1;                    // 默认构造
    Person p2("小明", 25);        // 有参构造
    Person p3 = {"小红", 22};     // 列表初始化

    return 0;
}  // 三个对象依次析构

初始化列表 vs 函数体内赋值

cpp
// ✅ 初始化列表(推荐——直接初始化,效率高)
Person(const std::string &n, int a) : name(n), age(a) { }

// ❌ 函数体赋值(先默认初始化,再赋值——多了一步)
Person(const std::string &n, int a) {
    name = n;
    age = a;
}

=default 和 =delete

cpp
class NonCopyable {
public:
    NonCopyable() = default;                  // 用编译器生成的默认构造
    NonCopyable(const NonCopyable &) = delete; // 禁止拷贝
    NonCopyable &operator=(const NonCopyable &) = delete;
};

拷贝构造 vs 移动构造

cpp
class Buffer {
    int *data;
    size_t size;
public:
    // 拷贝构造(深拷贝)
    Buffer(const Buffer &other) : size(other.size) {
        data = new int[size];
        std::copy(other.data, other.data + size, data);
    }
    // 移动构造(窃取资源)
    Buffer(Buffer &&other) noexcept
        : data(other.data), size(other.size) {
        other.data = nullptr;
        other.size = 0;
    }
    ~Buffer() { delete[] data; }
};