C++Primer13.3节练习

练习13.29:

该swap被调用时交换两个HasPtr& 类型的对象,运行时会交换HasPtr的数据成员ps和i,这两个成员都是内置的数据类型,会调用标准库的std::swap。而不是调用本身定义的swap,不会导致递归循环

练习13.30:

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


class HasPtr {
	friend void swap(HasPtr& lhs, HasPtr& rhs);
	friend inline void swap(HasPtr& hp1, HasPtr& hp2);
public:
	//构造函数分配新的string和计数器,将计数器置为1
	HasPtr(const std::string& s = std::string()): ps(new std::string(s)),i(0),use(new std::size_t(1)) { }

	//拷贝构造函数拷贝所有三个数据成员,并递增计数器
	HasPtr(const HasPtr& p) :ps(p.ps), i(p.i), use(p.use) { ++* use; }

	HasPtr& operator=(const HasPtr&);

	//定义读取ps的成员函数
	string& getPsValue();
	~HasPtr();

private:
	std::string* ps;
	int i;
	//记录有多少个对象共享*ps的成员
	std::size_t* use;
};

HasPtr::~HasPtr()
{
	if (-- * use == 0)
	{
		delete ps;
		delete use;
	}
}

HasPtr& HasPtr::operator=(const HasPtr& rhs)
{
	++* rhs.use;
	if (-- * use == 0)
	{
		delete ps;
		delete use;
	}
	ps = rhs.ps;
	i = rhs.i;
	use = rhs.use;
	return *this;
}


//定义解引用
string& HasPtr::getPsValue()
{
	return *ps;
}

//定义为内联函数
inline void swap(HasPtr& hp1, HasPtr& hp2)
{
	cout << "swap hp1 and hp2......................" << endl;
	using std::swap;
	swap(hp1.ps, hp2.ps);
	swap(hp1.i, hp2.i);
	swap(hp1.use, hp2.use);
}


int main()
{
	//测试,i都被初始化0,无需测试
	HasPtr hp1("hello");
	HasPtr hp2("world");
	cout << "before swap: " << endl;
	cout << "hp1: " << hp1.getPsValue()<< endl;
	cout << "hp2: " << hp2.getPsValue() << endl;
	cout << endl;
	//交换hp1和hp2
	swap(hp1, hp2);

	cout << endl;
	cout << "after swap: " << endl;
	cout << "hp1: " << hp1.getPsValue() << endl;
	cout << "hp2: " << hp2.getPsValue() << endl;
	system("pause");
	return 0;
}

测试结果:

练习13.31:

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


class HasPtr {
	friend void swap(HasPtr& lhs, HasPtr& rhs);
	friend inline void swap(HasPtr& hp1, HasPtr& hp2);
public:
	//构造函数分配新的string和计数器,将计数器置为1
	HasPtr(const std::string& s = std::string()): ps(new std::string(s)),i(0),use(new std::size_t(1)) { }

	//拷贝构造函数拷贝所有三个数据成员,并递增计数器
	HasPtr(const HasPtr& p) :ps(p.ps), i(p.i), use(p.use) { ++* use; }

	HasPtr& operator=(const HasPtr&);

	//定义<运算符
	bool operator<(const HasPtr&);

	//定义读取ps的成员函数
	string& getPsValue();
	~HasPtr();

private:
	std::string* ps;
	int i;
	//记录有多少个对象共享*ps的成员
	std::size_t* use;
};

HasPtr::~HasPtr()
{
	if (-- * use == 0)
	{
		delete ps;
		delete use;
	}
}

HasPtr& HasPtr::operator=(const HasPtr& rhs)
{
	++* rhs.use;
	if (-- * use == 0)
	{
		delete ps;
		delete use;
	}
	ps = rhs.ps;
	i = rhs.i;
	use = rhs.use;
	return *this;
}


string& HasPtr::getPsValue()
{
	return *ps;
}

//定义<运算符
bool HasPtr::operator<(const HasPtr& hp)
{
	return *ps < *hp.ps;
}

//定义为内联函数
inline void swap(HasPtr& hp1, HasPtr& hp2)
{
	cout << "swap hp1 and hp2......................" << endl;
	using std::swap;
	swap(hp1.ps, hp2.ps);
	swap(hp1.i, hp2.i);
	swap(hp1.use, hp2.use);
}


int main()
{
	//定义HasPtr的vector
	vector<HasPtr>v;
	HasPtr h1("hello");
	v.push_back(h1);
	HasPtr h2("c++");
	v.push_back(h2);
	HasPtr h3("world");
	v.push_back(h3);
	HasPtr h4("fuck");
	v.push_back(h4);
	HasPtr h5("blue");
	v.push_back(h5);
	HasPtr h6("what");
	v.push_back(h6);

	cout << "before sort:" << endl;
	for (HasPtr& hp : v)
	{
		cout << hp.getPsValue() << endl;
	}

	sort(v.begin(), v.end());
	cout << endl;

	cout << "after sort:" << endl;
	for (HasPtr& hp : v)
	{
		cout << hp.getPsValue() << endl;
	}

	system("pause");
	return 0;
}

 结果:

 练习13.32:

swap两个HasPtr类型会交换对象的ps和i数据,use数据都是先减1再加1,不变,ps和i都是内置数据类型,使用标准库的默认swap就可以处理该类型的交换,所以使用自己的swap并不会有什么益处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
c primer 15.9作业是关于异常处理的内容。在这一中,主要介绍了C语言中的错误处理机制和异常处理方式。 异常处理是一种程序设计中的重要思想,它允许应对出现的各种错误或异常情况,从而增加程序的健壮性和可靠性。C语言中的异常处理主要通过使用错误码和错误处理函数来实现。 在进行异常处理时,通常需要先定义一些错误码,用于标识可能出现的异常情况。C语言提供了一些标准的错误码,如errno.h头文件中定义的错误码,还可以根据需要自定义错误码。 接下来,我们需要在程序中合适的位置进行错误检测并进行异常处理。可以使用if语句或者switch语句等条件语句来检测错误码,并根据不同的错误码执行相应的错误处理代码。 错误处理代码的内容可以根据具体情况而定,它可以是打印错误信息、修复错误、返回错误码等操作。在处理完异常后,可以继续执行后续的程序逻辑,或者返回到调用处继续处理。 除了使用错误码和错误处理函数进行异常处理外,C语言还提供了一种特殊的异常处理方式,即信号处理。信号处理是通过捕捉和处理操作系统发送的信号来实现的,通过注册信号处理函数,可以在程序遇到特定信号时执行相应的处理代码。 总之,C语言中的异常处理是一种重要的错误处理机制,可以提高程序的可靠性和健壮性。通过定义错误码、错误处理函数和信号处理,可以有效地捕捉和处理各种异常情况。在编写C程序时,合理地使用异常处理机制是至关重要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白学C++.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值