日志20191205(5)

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值