std::move 和 std::swap

1、swap的实现是基于move的(自己实现的)

template<typename T>
void swap(T &a,T &b) noexcept
{
    T temp = std::move(a);
    a = std::move(b);
    b = std::move(temp);
}

2、移动构造和移动赋值操作符重载

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

class Test {
 public:
    Test(const char* str, int n) {
        cout << "[构造对象]---"<<"地址:" << this << "\n";
        p_ = new char[n+1];
        strcpy(p_, str);
    }
    // 拷贝构造
    Test(const Test& obj) {
        cout << "[拷贝构造]---"<<"地址:" << this << "\n";
        delete p_;
        p_ = nullptr;
        p_ = new char[obj.len+1];
        memcpy(p_, obj.p_, len);
    }
    // 移动构造
    Test(Test&& obj) {
        cout << "[移动构造]---"<<"地址:" << this << "\n";
        delete p_;
        p_ = nullptr;

        p_ = obj.p_;
        len = obj.len;

        obj.p_ = nullptr;
    }
    // 普通赋值操作符重载
    Test& operator =(const Test& obj) {
        cout << "[普通赋值]---"<<"地址:" << this << "\n";
        if(&obj != this) {
            Test tmp(obj);
            swap(*this, tmp);
        }

        return *this;
    }
    // 移动赋值操作符重载
    Test& operator =(Test&& obj) {
        cout << "[移动赋值]---"<<"地址:" << this << "\n";
            if(&obj != this) {
            // 注意此处是成员变量的swap
            swap(p_, obj.p_);
            swap(len, obj.len);
        }
        return *this;
    }
    ~Test() {
        cout << "[析构对象]---"<<"地址:" << this << "\n";
        delete[] p_;
    }
 private:
    char* p_ = nullptr;
    int len = 0;
};

int main(int args, char* argv[])
{
    if(1) {
        cout << "---Test a(\"123\", 3);--------------------\n";
        Test a("123", 3);   // 构造
        cout << "---Test b(a);--------------------\n";
        Test b(a);          // 普通拷贝
        cout << "---Test c = b;--------------------\n";
        Test c = b;         // 普通拷贝
        cout << "---c = a;--------------------\n";
        c = a;              // 普通赋值

        cout << "\n\n---------move&operator =--------------\n\n";
        cout << "---Test e(Test(\"123\", 3));--------------------\n";
        Test e(Test("123", 3));                 //普通构造
        cout << "---Test f(std::move(Test(\"123\", 3)));--------------------\n";
        Test f(std::move(Test("123", 3)));      //普通构造
        cout << "---Test g = std::move(Test(\"123\", 3));-------\n";
        Test g = std::move(Test("123", 3));     //普通构造
        cout << "---Test h(std::move(e));--------------------\n";
        Test h(std::move(e));                   //移动构造
        cout << "---h = std::move(f);--------------------\n";
        h = std::move(f);                       //移动赋值
    }
    std::cout << "Complete!\n";
    return 0;
}

执行输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值