C++ 移动构造和拷贝构造示例

默认构造:调用默认构造函数,老老实实构建实例
拷贝构造:在默认构造基础上,复制其他类的数据
移动语义:特定环节可省略一些步骤,如内存申请,直接将其他类数据拿来就用,并初始化其他类

#include <algorithm>
#include <iostream>

class X
{
private:
  int* data = nullptr;

public:
  X():
    data(new int[1000000])
  {

    std::cout << "new!" << data << std::endl;
}

  ~X()
  {
    std::cout << "delete!" << data << std::endl;
    delete [] data;
  }

  X(const X& other):  // 1 copy
   data(new int[1000000])
  {
    std::cout << "new->copy!" << data << std::endl;
    std::copy(other.data,other.data+1000000,data);
  }

  X(X&& other):  // 2 move
    data(other.data)
  {
    std::cout << "move!" << data << std::endl;
    other.data=nullptr;
  }
};

int main(){
    X x1; // new

    X x2(x1);  // new->copy
    X x3 = std::move(x1); // move

    X x4 = static_cast<X&&>(x2); // move
}

output:

[root@jn cpp]# ./a.out
new!0x7fb78f00f010
new->copy!0x7fb78ec3e010
move!0x7fb78f00f010
move!0x7fb78ec3e010
delete!0x7fb78ec3e010
delete!0x7fb78f00f010
delete!0
delete!0
[root@jn cpp]#

通常实现任意一个,其他两个都要实现:拷贝构造函数、拷贝赋值操作符和析构函数。

class ResourceHolder {
private:
    char* data;
public:
    ResourceHolder(const char* pData) {
        data = new char[strlen(pData) + 1];
        strcpy(data, pData);
    }

    ~ResourceHolder() {
        delete[] data;
    }

    ResourceHolder(const ResourceHolder& other) {
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
    }

    ResourceHolder& operator=(const ResourceHolder& other) {
        if (this == &other) return *this;
        delete[] data;
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
        return *this;
    }
};

以及常说的三个构造,两个赋值,一个析构示例

#include <iostream>

class MyClass {
public:
    // 默认构造函数
    MyClass() {
        std::cout << "Default Constructor" << std::endl;
    }

    // 参数化构造函数
    MyClass(int value) {
        std::cout << "Parameterized Constructor with value " << value << std::endl;
    }

    // 拷贝构造函数
    MyClass(const MyClass& other) {
        std::cout << "Copy Constructor" << std::endl;
    }

    // 拷贝赋值运算符重载
    MyClass& operator=(const MyClass& other) {
        std::cout << "Copy Assignment Operator" << std::endl;
        return *this;
    }

    // 移动赋值运算符重载
    MyClass& operator=(MyClass&& other) {
        std::cout << "Move Assignment Operator" << std::endl;
        return *this;
    }

    // 析构函数
    ~MyClass() {
        std::cout << "Destructor" << std::endl;
    }
};

int main() {
    MyClass obj1; // 默认构造函数
    MyClass obj2(42); // 参数化构造函数
    MyClass obj3 = obj1; // 拷贝构造函数
    MyClass obj4;
    obj4 = obj1; // 拷贝赋值运算符重载
    MyClass obj5;
    obj5 = std::move(obj1); // 移动赋值运算符重载

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值