左值与左值引用、右值与右值引用、移动构造函数。

爷,独闯天下 提交于 2020-03-11 12:19:25

1、什么是左值:可以被引用取地址的值。
在这里插入图片描述
在这里插入图片描述

const int a = 12; // a为左值
const int& pt = a; // pt为左值引用
double x1 = 1.2; // x1为左值
double& x2 = x1; // x2为左值引用

c风格字符串为左值。
详细介绍:C++ Primer Plus 8.2.3

2、什么是右值:可以出现在赋值表达式右边,但不能对其应用地址运算符的值。
在这里插入图片描述

int a = 10;
int b = 12;
int && x1 = 13; // 13为右值
int && x2 = a+b; //a+b为右值
double && x3 = std::sqrt(2.0) //std::sqrt(2.0)函数返回值为右值
double * ptr = &x1; // 通过右值引用获得13存储的地址

引入右值引用的目的之一:实现移动语义。
详细介绍:C++ Primer Plus 18.1.9

3、移动语义
不删除原对象,将其数据保留在原来位置,将现有对象与该位置关联。类似计算机中移动文件(只是移动了索引路径)。

在这里插入图片描述
4、移动构造函数与移动赋值运算符
例子:

//.h
Class Useless{
public:
	Useless(Useless&& f); // 移动构造函数,非const,参数为右值
	Useless& operator= (Useless&& f); // 移动赋值运算符
}

//.cpp
Useless four(one+two); // one+two为右值
Useless four=one+two; // one+two为右值

在这里插入图片描述
详细介绍:C++ Primer Plus 18.2.1

总结:

1、使用右值引用实现的移动语义有助于减少构造、析构临时返回对象造成的时间空间浪费
2、对大部分程序员,引入右值引用不是为了编写使用其的代码,而是调用使用其编写好的库代码
3、详细学习资料见C++ Primer Plus 18.2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!