【C++右值引用】左右值的交叉引用的具体情景,右值详讲
创始人
2024-04-10 12:32:28
0

 

目录

1.右值和左值

2.左值引用和右值引用 

3.左右值的交叉引用的具体情景

         3.4当不接受返回值就没有办法优化


1.右值和左值

左值与右值是C语言中的概念,但C标准并没有给出严格的区分方式,一般认为:可以放在=左边的,或者能 够取地址的称为左值,只能放在=右边的,或者不能取地址的称为右值,但是也不一定完全正确

左值可以取地址,可以赋值的

  • 下面的a,r1,p,r2就属于左值
  • b,r3虽然是被const修饰不能赋值,但是也是左值,左值是能取地址的值,可以被const修饰也是左值
	int a = 10;int& r1 = a;int* p = &a;int& r2 = *p;const int b = 10;const int& r3 = b;

右值:不能取地址的值

  • 纯右值,比如:X+Y, 10。
  • 将亡值,比如:表达式的中间结果((X+(Y+Z))Y+Z的值)、函数按照值的方式进行返回(返回值)。 
	//常见的右值10;x + y;fmin(x, y);

2.左值引用和右值引用 

  • 左值引用:b,d
  • 右值引用:a1,b1,c1

左值引用使用:&,右值引用使用:&&同是他们也是可以交叉引用

    //左值引用左值int a=1;int& b=a;int* c=&a;int& d=*c;//右值引用右值int X=10,int Y=20;int&& a1=10;int&& b1=X+Y;int&& c1=min(X,Y);

 2.1左右值的交叉引用

  • 左值引用右值-- 不能直接引用,但是const 左值引用可以引用右值

  • 右值引用左值-- 不能直接引用,但是可以右值引用可以引用move以后左值

    //左值引用右值-- 不能直接引用,但是const 左值引用可以引用右值const int& a=2;//右值引用左值-- 不能直接引用,但是可以右值引用可以引用move以后左值int a1=10;int&& b1=move(a1)

 

3.左右值的交叉引用的具体情景

3.1左值引用右值的具体情景

  1. 当参数直接传常数(右值),那么引用必须加一个const

3.2右值引用左值的具体情景 

class string{public:// 拷贝构造string(const string& s):_str(nullptr), _size(0), _capacity(0){cout << "string(const string& s) -- 深拷贝" << endl;string tmp(s._str);swap(tmp);}// 移动构造string(string&& s):_str(nullptr), _size(0), _capacity(0){cout << "string(string&& s) -- 资源转移" << endl;string operator+(char ch){string tmp(*this);push_back(ch);return tmp;}private:char* _str;size_t _size;size_t _capacity; // 不包含最后做标识的\0};

3.1移动构造:资源转移,没有了深拷贝和delete效率大大提高

  1. 没有深拷贝了,效率提升;
  2. 将亡值资源被转移了,它被换成nullptr,调析构函数,没有资源需要析构效率提高 

 3.2如果没有移动构造,调用重载+返回值是一个将亡值(右值),被s1接受,会调用两次拷贝构造(左值引用右值),但是编译器会有优化会当重载函数快结束的时候使用将亡值构造是s1;

 3.3如果有了移动构造,调用重载+返回值是一个将亡值(右值),被s1接受,会调用一次拷贝构造和一次移动构造,但是编译器会有优化会当重载函数快结束的时候使用将亡值移动构造是s1,资源转移比深拷贝效率更高

 3.4当不接受返回值就没有办法优化

 3.5push_back的右值引用的重载

  • 所有容器调用push_back都是左值调左值,右值调右值

 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...