构造与析构
构造函数重载、初始化列表、析构函数、拷贝构造、=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; }
};