右值引用

右值引用:

引用(C++98):别名,引用变量与其引用的实体公用同一块内存空间
引用的底层实现原理:就是按照指针的方式实现的
在C++中: 需要用到一级指针---->可以使用引用来代替
需要用到二级指针---->可以使用一级指针的引用来代替

在这里插入图片描述
在C++中,如果是自定义类型的参数,在传参时尽量使用引用来进行传递
如果想要通过形参改变外部实参---->T&
如果不想通过形参改变外部实参---->const T&

引用的性质 引用作为函数参数 引用作为函数的返回值(注意:一定不能返回栈上的空间)

为了提高运行效率,C++11中引入了右值引用,右值引用也是别名,但是其只能对右值引用。
在这里插入图片描述
在这里插入图片描述
返回的是左值
在这里插入图片描述
所以可以通过这样的方式进行赋值
在这里插入图片描述
C++11中左值和右值怎么区分?
在这里插入图片描述
在这里插入图片描述

那怎样让右值引用也可以引用左值呢?关键字move
在这里插入图片描述
move内部就相当于是类型转换

C++98中的引用既可以引用左值,也可以引用右值
C++11右值引用:
一把你情况下,只能引用右值,如果想要引用左值,必须要使用 move来进行转换
在之前的时候,我们已经自己写了string 类,在这里我们就不再重新写了
在这里插入图片描述
string S1(“111”);
string S2(“222”);
string S3;
S3 = S1 + S2;
我们上面实现的是对两个字符串进行相加
上面的代码有什么缺陷呢?
在返回的时候存在一次不必要的临时对象的拷贝,因为返回的是临时对象,所以会存在临时对象的拷贝,就会很浪费资源影响 程序的运行效率 。


改进:
在C++11中提出了一个概念就是,移动语义。即:将一个对象中资源移动到另一个对象中的方式,可以有效的缓解该问题。
在这里插入图片描述

右值引用最大优点

//移动构造函数
string(string&& s)
	:str(s.str)
{
	s.str = nullptr;
}
//移动赋值
string& operator=(string&& s)
{
	if(this != &s)
	{
		swap(str,s.str);
	}
	return *this;
}

如何判断一个构造对象的语句调用的是拷贝构造还是移动构造:
在这里插入图片描述
在这里插入图片描述
右值引用要是想引用左值,就需要通过move转一下。
在这里插入图片描述
完美转发:商家发什么货我们收到的就应该是什么货
在这里插入图片描述

有如下的代码,我们扣代试试,是不是完美转发

#include<iostream>
using namespace std;
void Fun(int &x)
{
	cout << "lvalue ref" << endl; 
}
void Fun(int &&x)
{
	cout << "rvalue ref" << endl;
}
void Fun(const int &x)
{
	cout << "const lvalue ref" << endl; 
}
void Fun(const int &&x)
{
	cout << "const rvalue ref" << endl; 
}
template<typename T>
void PerfectForward(T &&t)
{
	Func(t); 
}
int main()
{

	PerfectForward(10); // rvalue ref

	int a;
	PerfectForward(a); // lvalue ref
	PerfectForward(std::move(a)); // rvalue ref
	const int b = 8;
	PerfectForward(b); // const lvalue ref
	PerfectForward(std::move(b)); // const rvalue ref
	return 0;
}

实验之后发现不是完美转发。
void PerfectForward(T &&t)
{
Func(t); //在某些转发的过程中,参数的性质已经发生的了改变
}

在C++11中给出了使用forword来实现完美转发

void PerfectForward(T &&t)
{
	Fun(std::forward<T>(t));   //这样就是可以实现完美转发了 
}

forward和move底层实现差不多,但是给出了两个,原因就是两者适用的场景不同
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值