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;
}
执行输出: