#include <iostream>
#include <vector>
using namespace std;
class Rval {
public:
Rval() : m_val(new int(5)) {
cout << "Rval()" << endl;
}
Rval(const Rval& rhs) : m_val(new int(*rhs.m_val)) {
cout << "Rval(const Rval&)" << endl;
//Rval b = std::move(a)
//会调用该函数(如果没有Rval(Rval&& rhs){}这个函数);
}
Rval(Rval&& rhs) {
//当m_val资源很大时,右值拷贝构造速度就会开很多
m_val = rhs.m_val;
// rhs.m_val = nullptr; //m_val是private
rhs.setNull();
//rhs对象结束时,会调用析构函数,析构函数delete nullptr是合法的
cout << "Rval(Rval&& rhs)" << endl;
//Rval b = std::move(a)
//会优先调用该函数
}
Rval& operator=(const Rval& rhs) {
cout << "operator = " << endl;
*m_val = *(rhs.m_val);
return*this;
}
Rval& operator=(Rval&& rhs) {
cout << "operator=(const Rval&& rhs)" << endl;
if (m_val != rhs.m_val) {
delete m_val; //必须先释放掉自己的m_val,否则m_val指向的内存没有释放
m_val = rhs.m_val;
// rhs.m_val = nullptr;
rhs.setNull(); //const传参,不可以这样
}
return *this;
}
~Rval() {
cout << "~Rval()" << endl;
delete m_val;
}
void myprint() const {
cout << *m_val << endl;
return;
}
void setNull() {
m_val = nullptr;
}
private:
int* m_val;
};
void test() {
Rval b;
auto& c = b;
Rval d = std::move(b); //这个函数如果执行成功,就相当于把b直接废掉了
//b.myprint(); 程序会直接崩溃,b已经废掉了,即使不崩溃,也不建议使用
//如果没有右值重载,b还是合法,Rval d = move(b) move此时没有作用
Rval e;
e = std::move(e);
}
int main()
{
test();
return 0;
}