C++Premier14.1节练习

练习14.1:

区别:一些运算符的重载版本无法保留内置运算符的短路求值属性,或者无法保留内置运算符的求值顺序规则。重载的运算符函数至少含有一个类类型的参数

一致:重载运算符函数的参数数量与该运算符内置版本作用的运算对象一样多。对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符保持一致

练习14.2:

#include <iostream>
#include <string>
#include <errno.h>
using namespace std;

class Sales_date {
	//将非成员重载函数设置为友元函数
	friend Sales_date operator+(const Sales_date& h1, const Sales_date& h2);
	friend istream& operator >> (istream& is, Sales_date& item);
	friend ostream& operator << (ostream& os, const Sales_date& item);
public:
	//默认构造函数
	Sales_date():bookNo(std::string()){ }
	Sales_date(const std::string& s, unsigned us, double p):bookNo(s), units_sold(us), revenue(p*us) { }
	Sales_date(const std::string& s) :bookNo(s) { }
	//拷贝构造函数
	Sales_date(const Sales_date& s):bookNo(s.bookNo), units_sold(s.units_sold), revenue(s.revenue){ }
	//拷贝赋值运算符
	Sales_date& operator=(const Sales_date&);

	//复合赋值运算符
	Sales_date& operator+=(const Sales_date&);

	//得到bookNo
	std::string isbn()const { return bookNo; }

private:
	//平均售价
	double avg_price()const { return units_sold ? revenue / units_sold : 0; }
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

//拷贝赋值运算符
Sales_date& Sales_date::operator=(const Sales_date& s)
{
	bookNo = s.bookNo;
	units_sold = s.units_sold;
	revenue = s.revenue;

	return *this;
}

//复合赋值运算符
Sales_date& Sales_date::operator+=(const Sales_date& s)
{
	if (this->bookNo == s.bookNo)
	{
		units_sold = units_sold + s.units_sold;
		revenue = revenue + s.revenue;
		return *this;
	}
	else
	{
		throw runtime_error("bookNo is different");
	}
}

//重载的加法运算符
Sales_date operator+(const Sales_date& h1, const Sales_date& h2)
{
	if (h1.bookNo == h2.bookNo)
	{
		Sales_date sTemp = h1;
		sTemp.units_sold = sTemp.units_sold + h2.units_sold;
		sTemp.revenue = sTemp.revenue + h2.revenue;
		return sTemp;
	}
	else
	{
		//无法相加
		throw runtime_error("bookNo is different");
	}

}

//重载输入运算符
istream& operator >> (istream& is, Sales_date& item)
{
	double price;
	is >> item.bookNo >> item.units_sold >> price;
	//检查输入是否出错
	if (is)
	{
		item.revenue = item.units_sold * price;
	}
	else
	{
		//输入失败,对象被赋予默认的状态
		item = Sales_date();
	}
	return is;
}

//重载输出运算符
ostream& operator << (ostream& os, const Sales_date& item)
{
	os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
	return os;
}

int main()
{

	system("pause");
	return 0;
}

练习14.3:

(a):内置类型的==运算符,比较两个指针指向的内容

(b):string版本重载的==

(c):vector版本重载的==

(d):此处书上左边的变量多了一个”,去除,使用的是string版本重载的==,右边的字面值字符串被转换为string类型

练习14.4:

%一般定义为非成员函数

%=改变对象状态,一般定义为成员函数

++会改变对象状态,一般定义为成员函数

->必须定义为成员函数

<<必须定义为非成员函数

&&是对称性的运算符,一般定义为非成员函数

==是对称性的运算符,一般定义为非成员函数

()必须定义为成员函数

练习14.5:

略,与Sales_Date的重载运算符的编写一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 格外实用的c语言编程书籍——premier电子版。它是由Prata编写的,是一本<classic>级别的大部头教材,对c语言的各个方面进行了细致地讲解。该书在全球范围内广受好评,被誉为c语言编程经典入门读物。相较于传统的纸质版,电子版更具备便携性和交互性两大特点。在电子版上,你可以轻松地进行文字搜索、章跳转、笔记记录等操作,在阅读体验上更为人性化,使你更好地掌握知识。 此书内容详尽、深入浅出,对想从事c语言编程的软件工程师具有广泛的适用性,从初学者到进阶者都能够从中获益良多。全书共计1100多页,涵盖了c语言的基础知识和高级应用,包括数据类型、流控制语句、结构体、函数、指针、内存管理等等。同时,该书中还有大量的示例代码和练习题,非常适合用来辅助学习和巩固所学知识。 总之,c语言是计算机编程语言中必不可少的一门,而premier电子版则是学习c语言的必备工具书。不管是从事软件开发的新手,还是追求技术深度的老手,都能够从这本书中汲取到宝贵的知识,帮助他们更好地编写优秀的程序。 ### 回答2: c premier是一种用于C语言编程的电子版本集成开发环境(IDE),它可以提供一个完整的开发环境,包括编辑器、编译器和调试器。使用c premier电子版可以方便地编写和管理C语言程序,加速开发流程,减少开发错误。c premier具有先进的功能,如语法突出显示、自动完成和脚本编写等,可用于各种类型的C语言程序开发包括嵌入式系统、桌面应用程序等。此外,c premier还具有强大的调试器,可以帮助开发人员查找和修复程序中的错误。c premier电子版的优势之一是它可以在不同平台上运行,包括Windows、Mac和Linux系统。总之,c premier电子版是一种非常实用的C语言开发环境,可以轻松编写高质量的C语言程序。 ### 回答3: Premier电子版是一种数字化的电子期刊,主要用于在线发布、订阅和阅读相关的经济、商业、金融和管理等领域的文章和研究。该电子版的优势在于其能够提供便利快捷的服务,用户无需购买实体版本,通过在线订阅即可随时随地浏览该刊物,方便用户学习和参考。此外,Premier电子版可以保证内容质量和权威性,其收录的文章和报告均来自于经过严格审稿的学术或专业期刊,保证了内容的可信度和专业性。另外,Premier电子版拥有较完善的检索和分类系统,用户可以按照自己的需求和兴趣对文章进行检索和筛选,从而省时间和精力。总的来说,Premier电子版为学术研究者、商业从业者和爱好者提供了一个高质量、可信、便捷和多样的学习和借鉴资源,有助于推动相关领域的发展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白学C++.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值