右值引用

引用: 左值引用&和右值引用&&

左值引用:有名字,有内存,生命周期不会马上结束
int a=10;
int &b=a;
int &c=20;//错误,因为20没有地址,无法将20的地址放入引用c的寄存器中
引用必须被初始化,引用跟初始化时绑定关系
访问引用会自动进行解引用操作,在底层和指针的操作基本相同

右值引用:临时量,没名字,没内存,生命周期马上到了==>右值
int &&d=20;//产生一个 内存空间,把20放入 内存空间,再把 内存空间的地址放入寄存器,在转入引用的内存空间中
d=30;是把刚刚的内存空间的值改为30,而这个内存呢空间处在main函数的栈帧上

系统自动更具调用的环境匹配对应的左值或者右值的函数。
所以只要两个对象不再一个作用域,且生存期不同,那么在匹配时,都会匹配为右值的拷贝或者赋值重载函数
带右值引用参数的拷贝构造函数和赋值重载函数:	Vector v3=临时对象

Vector(Vector &&src)//因为需要把原来的指针指向nullptr所以不能加const
{
	_pVec=src._pVec;
	_size=src._size;
	_cursize=src._cursize;
	src._pVec=nullptr;
}
这样就免去了临时对象对栈空间的临时对象的拷贝构造函数所造成的资源浪费
Vector& operator=(Vector &&src)
{
	delete[] _pVec;
	_pVec=src._pVec;
	_size=src._size;
	_cursize=src._cursize;
	src._pVec=nullptr;
}

Seqstack s1;
Seqstack s3;
s3=std::move(s1);//(Seqstack&&)s1,是c++库提供的右值强转操作,std::move
		//当s1的值被右值赋值给s3后,s1的内容就会失去,无法在正确访问其内容

Seqstack s4=Seqstack(20);//c++编译器:如果用临时对象拷贝构造新对象,那么临时对象就被优化掉,直接构造
			//新的对象,相当于优化为Seqstack(20);
			//

所以:Seqstack s5=getstack(s4);//getstack()是一个返回临时对象的函数,这时编译器就会优化为直接通过
				//getstack()中的对象拷贝构造s5,并不会在main函数的栈帧中开辟临时对象
				//通过调用右值拷贝构造函数初始化s5
				//这是只有通过临时对象初始化新的对象才会出现的优化操作

这里和Seqstack s6;
s6=getstack(s4);不同,这里是赋值操作,是采用的右值的拷贝构造和右值的赋值操作
		//先对返回值进行拷贝构造产生一个临时对象,在析构函数内的对象,然后通过临时对象对
		//s6进行右值引用赋值操作,然后在对临时对象调用析构函数






构造函数的初始化列表:
引用在对象中的初始化方式:只能在列表中初始化,在{}内属于赋值操作,那么引用是无法初始化的
尽量将成员变量放在列表中初始化
class Point
{
public:
	Point(int &x);
private:
	int &r;
}

Point::Point(int &x):r(x)
{	}


Seqstack(int size = 10)
	:mpStack(new int[size])
	,mtop(0)
	,msize(size)
{}

关于容器的右值拷贝
class Func
{
public:
Func() {}
Func(const Func&) { cout << “Func(const Func&)” << endl; }
Func(Func&&) { cout << “Func(Func&&)” << endl; }
};
vector getVecotor()
{
vector vec; // 0
vec.reserve(100);
for (int i = 0; i < 10; ++i)
{
vec.push_back(Func());
}
return vec; //
}
int main()
{
Func f;
vector vec; // 0
vec.reserve(10); // 给容器预留空间函数 reverse
vec.push_back(f);//一次左值拷贝构造
vec.push_back(Func());//10次右值拷贝构造
vector vec2 = getVecotor(); // vector(vector&&)//由于编译器优化,返回时还有一次拷贝构造,
//但是要注意的是这次的拷贝构造是属于vector的
//而不是Func对象的
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值