[Effective C++]条款05:了解C++默默编写并调用哪些函数

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;
};

思维导图笔记请添加图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值