#include <iostream>
#include <cstring>
class MyData {
public:
int id; // 基础变量
char* name; // 指针变量,指向动态分配的内存
// 默认构造函数
MyData(int id_, const char* name_)
: id(id_), name(new char[strlen(name_) + 1])
{
std::strcpy(name, name_);
std::cout << "Constructor: " << name << std::endl;
}
// 拷贝构造函数
MyData(const MyData& other)
: id(other.id), name(new char[strlen(other.name) + 1])
{
std::strcpy(name, other.name);
std::cout << "Copy Constructor: " << name << std::endl;
}
// 拷贝赋值运算符
MyData& operator=(const MyData& other)
{
if (this != &other) {
delete[] name;
id = other.id;
name = new char[strlen(other.name) + 1];
std::strcpy(name, other.name);
std::cout << "Copy Assignment: " << name << std::endl;
}
return *this;
}
// 移动构造函数
MyData(MyData&& other) noexcept
: id(other.id), name(other.name)
{
other.name = nullptr;
std::cout << "Move Constructor" << std::endl;
}
// 移动赋值运算符
MyData& operator=(MyData&& other) noexcept
{
if (this != &other) {
delete[] name;
id = other.id;
name = other.name;
other.name = nullptr;
std::cout << "Move Assignment" << std::endl;
}
return *this;
}
// 析构函数
~MyData()
{
std::cout << "Destructor: " << (name ? name : "null") << std::endl;
delete[] name;
}
};
int main() {
MyData a(1, "alpha"); // 普通构造
MyData b = a; // 拷贝构造
MyData c(2, "charlie");
c = a; // 拷贝赋值
MyData d = std::move(a); // 移动构造
MyData e(3, "echo");
e = std::move(b); // 移动赋值
}
类型 | 使用时机 | 通常目的 |
拷贝构造 | 初始化时 A a = b; | 深拷贝,复制资源 |
拷贝赋值 | 已存在对象赋值 a = b; | 释放原资源,再复制 |
移动构造 | 初始化时 A a = std::move(b); | “窃取”资源,提高性能 |
移动赋值 | a = std::move(b); | 释放原资源,窃取右值资源 |