右值引用和移动语义

什么是左值和右值

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

右值也是一个表示数据的表达式,如:**字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)**等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。右值引用就是对右值的引用,给右值取别名。

常量,表达式,函数返回值,直接引用因为权限放大会报错,不能引用临时变量和常量,加上const可以

使用右值引用不会报错

move

使用move可以把左值变成右值,但是只是返回值是右值,不会改变原来变量的属性。

万能引用,完美转发

函数模板使用右值引用,就是万能引用,你传什么就是什么引用

右值引用应用场景

c++11给类新增了,移动构造和移动赋值的成员函数。

比起普通的拷贝构造,通过重复利用了将亡值的资源,节省了构造时间。

对于以下类,如果我们没有移动构造,在接收函数返回的对象时就会浪费时间。

如果有移动构造,那么编译器检测到这个返回值是将亡值,会自动去掉移动构造,节省时间。

下面是这个类的代码

cpp 复制代码
class A
{
public:
	A(const char* s,int n)
	{
		cout << "A(const char* s,int n)" << endl;
		_s = new char[n];
		_n = n;
		for (int i = 0; i < n; i++)
			_s[i] = s[i];
	}
	A(const A& a)//拷贝构造
	{
		cout << "A(const A& a)" << endl;
		_s = new char[a._n];
		_n = a._n;
		for (int i = 0; i < _n; i++)
			_s[i] = a._s[i];
	}
	A( A&& a)//移动构造
	{
		cout << "A( A&& a)" << endl;
		swap(_s, a._s);
		swap(_n, a._n);
	}
	A& operator=(const A& a)//赋值运算符重载
	{
		cout << "A& operator=(const A& a)" << endl;
		_s = new char[a._n];
		_n = a._n;
		for (int i = 0; i < _n; i++)
			_s[i] = a._s[i];
		return *this;
	}
	A& operator=(A&& a)//移动赋值
	{
		cout << "A& operator=(A&& a)" << endl;
		swap(a._s, _s);
		swap(a._n, _n);
		return *this;
	}

	~A()
	{
		//cout << "~A()" << endl;
		delete[] _s;
	}
private:
	char* _s = nullptr;
	int _n = 0;
};
A fun()
{
	A tmp = A("333", sizeof("333"));
	return tmp;
}

int main()
{
	A a("444", sizeof("444"));
	a = fun();
}
相关推荐
励志要当大牛的小白菜3 分钟前
ART配对软件使用
开发语言·c++·qt·算法
PAK向日葵1 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
QQ_4376643145 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
liulilittle7 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
小狄同学呀7 小时前
VS插件报错,g++却完美编译?API调用错因分析
c++
程序员编程指南7 小时前
Qt 数据库连接池实现与管理
c语言·数据库·c++·qt·oracle
小乖兽技术7 小时前
C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
c++·c#·交互
张北北.7 小时前
【深入底层】C++开发简历4+4技能描述6
java·开发语言·c++
刚入坑的新人编程8 小时前
暑期算法训练.9
数据结构·c++·算法·leetcode·面试·排序算法
破刺不会编程10 小时前
linux线程概念和控制
linux·运维·服务器·开发语言·c++