拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符

1. 拷贝构造函数

  • 定义FourByteStruct(const FourByteStruct &fourByteStruct)
  • 调用时机
    • 当初始化一个对象时使用另一个相同类型的对象。例如:
      FourByteStruct obj1; // 默认构造
      FourByteStruct obj2 = obj1; // 拷贝构造
      
    • 当将一个对象作为参数以值传递(通过拷贝来创造一个形参副本)。
      void func(FourByteStruct fs);
      func(obj1); // 调用拷贝构造函数
      
    • 在返回一个对象时(除了移动对象的情况):
      FourByteStruct func() {
          FourByteStruct localObj;
          return localObj; // 需要拷贝构造一个返回值(在不使用移动语义的情况下)
      }
      

2. 拷贝赋值运算符

  • 定义FourByteStruct &operator=(const FourByteStruct &fourByteStruct)
  • 调用时机
    • 在已有对象上赋值另一个对象时:
      FourByteStruct obj1;
      FourByteStruct obj2;
      obj1 = obj2; // 调用拷贝赋值运算符
      

3. 移动构造函数

  • 定义FourByteStruct(FourByteStruct &&fourByteStruct) noexcept
  • 调用时机
    • 当一个对象以右值的形式被创建并初始化另一个对象时。例如:
      FourByteStruct createObject() {
          FourByteStruct temp;
          return temp; // 移动构造函数被调用
      }
      FourByteStruct obj = createObject(); // obj 将调用移动构造函数
      
    • 当将一个临时对象(右值)用于初始化时:
      FourByteStruct obj = FourByteStruct(); // 移动构造
      

4. 移动赋值运算符

  • 定义FourByteStruct &operator=(FourByteStruct &&fourByteStruct) noexcept
  • 调用时机
    • 在已有对象上通过赋值操作接收一个右值时:
      FourByteStruct obj1;
      FourByteStruct obj2;
      obj1 = std::move(obj2); // 调用移动赋值运算符
      
    • 当一个临时对象(右值)被赋值给一个已有对象时:
      FourByteStruct obj1;
      obj1 = FourByteStruct(); // 移动赋值运算符被调用
      

具体实现


    // 拷贝构造函数
    FourByteStruct(const FourByteStruct &fourByteStruct) : byte(fourByteStruct.byte),
                                                           value_uint32_t(fourByteStruct.value_uint32_t) {}
    // 拷贝赋值函数
    FourByteStruct &operator=(const FourByteStruct &fourByteStruct) {

        if (this != &fourByteStruct) {
            this->byte = fourByteStruct.byte;
            this->value_uint32_t = fourByteStruct.value_uint32_t;
        }
        return *this;
    }

    // 移动构造函数
    FourByteStruct(FourByteStruct &&fourByteStruct) noexcept
            : byte(std::move(fourByteStruct.byte)), value_uint32_t(fourByteStruct.value_uint32_t) {
        fourByteStruct.value_uint32_t = 0; 
    }

    // 移动赋值运算符
    FourByteStruct &operator=(FourByteStruct &&fourByteStruct) noexcept {
        if (this != &fourByteStruct) { 
            this->byte = std::move(fourByteStruct.byte); 
            this->value_uint32_t = fourByteStruct.value_uint32_t; 
            fourByteStruct.value_uint32_t = 0; 
        }
        return *this;
    }
posted @ 2025-03-04 11:10  BlackSnow  阅读(105)  评论(0)    收藏  举报