右值以及移动函数

右值以及移动函数

如果称 &i = a; i是左值运算; 那&&i = a为右值运算;

**当然为右值运算右边的值应该为一个常数; **

正是新定义的右值运算, 也就有了移动函数;


#include <iostream>
#include <cstdlib>
#include <string>
#include <utility>
#include <vector>

//移动拷贝;
//移后源对象必须可析构;
class T1
{
public:
	T1() = default;
	~T1() = default;
	T1(const T1 &) = default;

	//赋值运算符既是移动运算符, 也是拷贝赋值运算符;
	T1 & operator = (T1 t1) { std::swap(*this, t1); return *this; }
	//noexcept : 保证程序的移动函数是绝对正确 没有异常的;
	T1(T1 &&t1) noexcept : x(t1.x), str(t1.str) {}

	//引用限定符;
	T1 & operator = (const T1 &) &;			//只能向可修改的左值赋值
	//T1 Fun() & const; 只能将 & 放在const之后;
	T1 Fun() const &; 						//可用于任何类型的T1;
	T1 Fun1() && ;							//只能用于可改变的右值;

private:
	int x;
	std::string str;
};
//T1::T1(T1 &&t1) noexcept
//{
//	x = t1.x;
//	str = t1.str;
//}



int main()
{
	//右值引用;
	//右边的值是非变量, 而且这样右侧的值即将被销毁; 右侧的只能用于销毁和赋值操作;
	int i = 0;
	int &x1 = i;
	int &&x2 = 1;
	int &&x3 = i * i;
	int &&x4 = std::move(x3);
	x3 = 32;						//当x3改变时, x4也会改变
	std::cout << x3 << " " << x4;

	system("pause");
	return 0;
}


当然, 自己看右值的时候已经很蒙了, 还是等很久再来重温它应该会理解更深刻;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值