C++Primer13.6.3节练习

练习13.55:

	//右值引用版本的push_back
	void push_back(std::string&& s)&& { data->push_back(s); };

练习13.56:

首先会拷贝本对象创建一个副本,返回它的sort()成员,是一个左值,然后继续递归,陷入死循环,直至堆栈溢出

练习13.57:

这里sort函数返回的是一个临时的变量,是一个右值,程序正常运行,不会递归调用陷入死循环,但是由于是左值或者const限定的,排序的只是临时变量,原来的左值顺序不会发生变化

练习13.58:

简易的新版本Foo类,使用练习13.56中的左值返回

#include <iostream>
#include <string>
using namespace std;
#include <vector>
#include <algorithm>

class Foo {
public:
	//可用于可改变的左值
	Foo sorted() &&;	
	//可用于任何类型的Foo
	Foo sorted() const &;	
	//Foo的其他成员的定义

private:
	vector<int> data;
};

//本对象为右值,因此可以原址排序
Foo Foo::sorted()&&
{
	sort(data.begin(), data.end());
	return *this;
}

//本对象是const或是一个左值,哪种情况我们都不能对其进行原址排序
Foo Foo::sorted()const &
{
	//拷贝一个副本
	Foo ret(*this);
	cout << "Foo Foo::sorted()const &" << endl;
	//返回副本排序
	return ret.sorted();
}


int main()
{
	Foo f;
	f.sorted();
	system("pause");
	return 0;
}

发生循环递归,导致堆栈溢出

将soerted函数换为练习13.57的右值返回版本

Foo Foo::sorted()const &
{
	cout << "Foo Foo::sorted()const &" << endl;
	return Foo(*this).sorted();
}

发现不会报错,程序正常运行,但是排序的只是副本,而不是原对象

测试:

int main()
{
	vector<int>v = { 2,5,8,5,3,9 };
	Foo f(v);
	f.sorted();
	f.print();
	system("pause");
	return 0;
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学C++.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值