1、当你创建一个空的 class 类时,编译器会自动一些函数
空的 class 类
class MyClass {
// 空的类,没有任何成员变量或成员函数
};
编译器自动生成的函数
- 默认构造函数
- 默认析构函数
- 拷贝构造函数
- 拷贝赋值操作符
- 移动构造函数(C++11 起)
- 移动赋值操作符(C++11 起)
class MyClass {
public:
// 1. 默认构造函数
MyClass() = default;
// 2. 默认析构函数
~MyClass() = default;
// 3. 拷贝构造函数
MyClass(const MyClass& other) = default;
// 4. 拷贝赋值操作符
MyClass& operator=(const MyClass& other) = default;
// 5. 移动构造函数(C++11 起)
MyClass(MyClass&& other) = default;
// 6. 移动赋值操作符(C++11 起)
MyClass& operator=(MyClass&& other) = default;
};
上述函数调用触发时机
MyClass obj; // 调用默认构造函数
{
MyClass obj; // 对象创建
} // 对象销毁,调用析构函数
MyClass obj1;
MyClass obj2 = obj1; // 调用拷贝构造函数
MyClass obj1, obj2;
obj1 = obj2; // 调用拷贝赋值操作符
MyClass obj1;
MyClass obj2 = std::move(obj1); // 调用移动构造函数
MyClass obj1, obj2;
obj1 = std::move(obj2); // 调用移动赋值操作符
2、如果定义了任何构造函数(例如带参数的构造函数)
- 编译器将不再生成默认构造函数,但其他函数(如析构函数、拷贝构造函数等)仍然会自动生成,除非你显式定义它们。
class MyClass {
public:
MyClass(int x) {} // 自定义构造函数
};
3、构造函数的参数为 reference 引用类型时
- 在 C++ 中,引用(reference) 在初始化后不能更改其绑定的对象。如果一个类的成员变量是引用类型,那么在对象的整个生命周期中,该引用必须始终指向同一个对象。
class MyClass {
public:
int& ref; // 引用类型的成员变量
// 构造函数
MyClass(int& value) : ref(value) {}
};
- 如果实现默认的拷贝赋值操作符,会遇到问题:
MyClass& operator=(const MyClass& other) {
if (this != &other) {
ref = other.ref; // 错误:不能修改引用绑定的对象
}
return *this;
}
解决方案:
方法 1:使用指针代替引用
class MyClass {
public:
int* ptr; // 使用指针代替引用
// 构造函数
MyClass(int& value) : ptr(&value) {}
// 拷贝赋值操作符
MyClass& operator=(const MyClass& other) {
if (this != &other) {
ptr = other.ptr; // 指针可以重新赋值
}
return *this;
}
};
方法 2:禁用拷贝赋值操作符
class MyClass {
public:
int& ref; // 引用类型的成员变量
// 构造函数
MyClass(int& value) : ref(value) {}
// 禁用拷贝赋值操作符
MyClass& operator=(const MyClass& other) = delete;
};
思维导图笔记

1071

被折叠的 条评论
为什么被折叠?



