《C++ Primer》第14章 操作重载与类型转换

14.3节  算术和关系运算符  习题答案

练习14.13:你认为Sales_data类还应该支持哪些其他算术运算符(参见表4.1,第124页)?如果有的话,请给出它们的定义。

【出题思路】

本题练习重载运算符的实现。

【解答】

对于Sales_data类,其实我们并不需要再为它添加其他算术运算符。但是这里我们可以考虑为它实现一个减法运算符。

#ifndef SALES_DATA14_13_H
#define SALES_DATA14_13_H#include <iostream>
#include <string>class Sales_data
{friend std::istream& operator>>(std::istream&, Sales_data&);friend std::ostream& operator<<(std::ostream&, const Sales_data&);friend bool operator<(const Sales_data&, const Sales_data&);friend bool operator==(const Sales_data&, const Sales_data&);friend Sales_data operator-(const Sales_data &lhs, const Sales_data &rhs);//重载减法运算符public:Sales_data() = default;Sales_data(const std::string &book): bookNo(book) {  }Sales_data(std::istream &is) { is >> *this; }public:Sales_data& operator+=(const Sales_data&);Sales_data& operator-=(const Sales_data &rhs);//重载-=运算符std::string isbn() const { return bookNo; }double avg_price() const;private:std::string bookNo;                 //书号unsigned units_sold = 0;            //出售册数double revenue = 0.0;               //收入
};inline bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{return lhs.isbn() == rhs.isbn();
}Sales_data operator+(const Sales_data&, const Sales_data&);inline bool operator==(const Sales_data &lhs, const Sales_data &rhs)
{return (lhs.units_sold == rhs.units_sold) &&(lhs.revenue == rhs.revenue) &&(lhs.isbn() == rhs.isbn());
}inline bool operator !=(const Sales_data &lhs, const Sales_data &rhs)
{return !(lhs == rhs);
}Sales_data& Sales_data::operator +=(const Sales_data& rhs)
{units_sold += rhs.units_sold;revenue += rhs.revenue;return *this;
}Sales_data operator +(const Sales_data& lhs, const Sales_data& rhs)
{Sales_data ret(lhs);ret += rhs;return ret;
}
//添加重载-运算符
Sales_data operator-(const Sales_data &lhs, const Sales_data &rhs)
{Sales_data sub = lhs;sub -= rhs;return sub;
}
//添加重载-=运算符
Sales_data& Sales_data::operator-=(const Sales_data &rhs)
{units_sold -= rhs.units_sold;revenue -= rhs.revenue;return *this;
}std::istream& operator>>(std::istream& in, Sales_data& s)
{double price;in >> s.bookNo >> s.units_sold >> price;if(in)s.revenue = s.units_sold * price;elses = Sales_data();return in;
}std::ostream& operator <<(std::ostream& out, const Sales_data& s)
{const char sep = '\t';out << "\n\t" << s.isbn() << sep << s.units_sold << sep<< s.revenue << sep << s.avg_price();return out;
}double Sales_data::avg_price() const
{if(units_sold)return revenue / units_sold;elsereturn 0;
}#endif // SALES_DATA14_13_H
#include "Sales_data14_13.h"#include <iostream>using namespace std;int main()
{Sales_data trans1, trans2;std::cout << "请输入两条ISBN相同的销售记录:" << std::endl;std::cin >> trans1 >> trans2;std::cout << "两条销售记录的差" << trans1 - trans2 << std::endl;cout << "Hello World!" << endl;return 0;
}

运行结果:

练习14.14:你觉得为什么调用operator+=来定义operator+比其他方法更有效?

【出题思路】

理解重载运算符的不同实现方式。

【解答】

显然,从头实现operator+的方式与借助operator+=实现的方式相比,在性能上没有优势,而可读性上后者显然更好。因此,在此例中代码复用是最好的方式。

练习14.15:你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应该含有其他算术运算符吗?如果是,请实现它们;如果不是,解释原因。

【出题思路】

本题练习实现重载运算符。

【解答】

在练习7.40中,我们编写了类Date。算术运算对Date并没有太大意义,因此不需要为Date重载算术运算符。

练习14.16:为你的StrBlob类(参见12.1.1节,第405页)、StrBlobPtr类(参见12.1.6节,第421页)、StrVec类(参见13.5节,第465页)和String类(参见13.5节,第470页)分别定义相等运算符和不相等运算符。

【出题思路】

本题练习实现相等运算符。

【解答】

//为StrBlob定义==和!=
class StrBlob{friend bool operator==(const StrBlob &lhs, const StrBlob &rhs);friend bool operator!=(const StrBlob &lhs, const StrBlob &rhs);//其他成员
};bool operator==(const StrBlob &lhs, const StrBlob &rhs)
{return lhs.data == rhs.data;
}bool operator!=(const StrBlob &lhs, const StrBlob &rhs)
{return !(lhs == rhs);
}
//为StrBlobPtr定义==和!=
class StrBlobPtr{friend bool operator==(const StrBlobPtr &lhs, const StrBlobPtr &rhs);friend bool operator!=(const StrBlobPtr &lhs, const StrBlobPtr &rhs);//其他成员
};bool operator==(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{auto l = lhs.wptr.lock();auto r = rhs.wptr.lock();if(l == r)//两个指针都为空,或指向相同vector且curr指向相同元素时,相等,否则不等return (!r || lhs.curr == rhs.curr);elsereturn false;//指向不同vector时,不等
}bool operator!=(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{return !(lhs == rhs);
}
//为StrVec定义==和!=
class StrVec{friend bool operator==(const StrVec &lhs, const StrVec &rhs);friend bool operator!=(const StrVec &lhs, const StrVec &rhs);//其他成员
};bool operator==(const StrVec &lhs, const StrVec &rhs)
{if(lhs.size() != rhs.size())return false;for(auto itr1 = lhs.begin(), itr2 = rhs.begin(); itr1 != lhs.end(),itr2 != rhs.end(); itr1++, itr2++){if(*itr1 != *itr2)return false;}return true;
}bool operator!=(const StrVec &lhs, const StrVec &rhs)
{return !(lhs == rhs);
}
//为String定义==和!=
class String{friend bool operator==(const String &lhs, const String &rhs);friend bool operator!=(const String &lhs, const String &rhs);//其他成员private:const char *str;
};bool operator==(const String &lhs, const String &rhs)
{return strcmp(lhs.str, rhs.str);
}bool operator!=(const String &lhs, const String &rhs)
{return !(lhs == rhs);
}

练习14.17:你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应该含有相等运算符吗?如果是,请实现它;如果不是,解释原因。

【出题思路】

本题练习判断类是否需要相等运算符及实现。

【解答】

在练习7.40中,我们实现了Date类。因为我们可以比较两个日期是否相等,因此需要实现相等运算符。

#include <iostream>using namespace std;class Date
{friend std::istream& operator>>(std::istream&, Date&);friend ostream& operator<<(ostream &os, const Date &dt);friend bool operator==(const Date &d1, const Date &d2);friend bool operator!=(const Date &d1, const Date &d2);public:Date(){}Date(int y, int m, int d){year = y;month = m;day = d;}private:int year;int month;int day;
};istream& operator>>(std::istream& is, Date& inDt)
{is >> inDt.year >> inDt.month >> inDt.day;if(!is){inDt = Date(0, 0, 0);cout << "input data error====================" << endl;}return is;
}ostream& operator<<(ostream& os, const Date& d)
{const char sep = '\t';os << "year:" << d.year << sep << "month:" << d.month << sep << "day:" << d.day << endl;return os;
}bool operator==(const Date &d1, const Date &d2)
{return (d1.year == d2.year) && (d1.month == d2.month) && (d1.day == d2.day);
}bool operator!=(const Date &d1, const Date &d2)
{return !(d1 == d2);
}int main()
{Date date1(2017, 8, 7);Date date2(2017, 8, 8);bool isEqual = (date1 != date2);cout << "date==========" << isEqual << endl;return 0;
}

运行结果:date==========1

练习14.18:为你的StrBlob类、StrBlobPtr类、StrVec类和String类定义关系运算符。

【出题思路】

本题练习实现关系运算符。

【解答】

本题的关键是明确关系运算符的语义。

String类的关系运算符就是比较两个字符串字典序的先后。

//为String定义<, <=, >,>=
class String{friend bool operator<(const String &s1, const String &s2);friend bool operator<=(const String &s1, const String &s2);friend bool operator>(const String &s1, const String &s2);friend bool operator>=(const String &s1, const String &s2);//其他成员private:const char *str;
};bool operator<(const String &s1, const String &s2)
{return strcmp(s1.str, s2.str) < 0;
}bool operator<=(const String &s1, const String &s2)
{return strcmp(s1.str , s2.str) <= 0;
}bool operator >(const String &s1, const String &s2)
{return strcmp(s1.str, s2.str) > 0;
}bool operator >=(const String &s1, const String &s2)
{return strcmp(s1.str, s2.str) >= 0;
}

练习14.19:你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应该含有关系运算符吗?如果是,请实现它;如果不是,解释原因。

【出题思路】

本题练习实现关系运算符。

【解答】

在练习7.40中,我们编写了类Date。对于日期,可以比较其大小,因此需要为它重载关系运算符。

#include <iostream>using namespace std;class Date
{friend std::istream& operator>>(std::istream&, Date&);friend ostream& operator<<(ostream &os, const Date &dt);friend bool operator==(const Date &d1, const Date &d2);friend bool operator!=(const Date &d1, const Date &d2);friend bool operator<(const Date &d1, const Date &d2);friend bool operator<=(const Date &d1, const Date &d2);friend bool operator>(const Date &d1, const Date &d2);friend bool operator>=(const Date &d1, const Date &d2);public:Date(){}Date(int y, int m, int d){year = y;month = m;day = d;}private:int year;int month;int day;
};istream& operator>>(std::istream& is, Date& inDt)
{is >> inDt.year >> inDt.month >> inDt.day;if(!is){inDt = Date(0, 0, 0);cout << "input data error====================" << endl;}return is;
}ostream& operator<<(ostream& os, const Date& d)
{const char sep = '\t';os << "year:" << d.year << sep << "month:" << d.month << sep << "day:" << d.day << endl;return os;
}bool operator==(const Date &d1, const Date &d2)
{return (d1.year == d2.year) && (d1.month == d2.month) && (d1.day == d2.day);
}bool operator!=(const Date &d1, const Date &d2)
{return !(d1 == d2);
}bool operator<(const Date &d1, const Date &d2)
{return (d1.year < d2.year) || (d1.year == d2.year && d1.month < d2.month)||(d1.year == d2.year && d1.month == d2.month && d1.day < d2.day);
}bool operator <=(const Date &d1, const Date &d2)
{return (d1 < d2) || (d1 == d2);
}bool operator >(const Date &d1, const Date &d2)
{return !(d1 <= d2);
}bool operator >=(const Date &d1, const Date &d2)
{return (d1 > d2) || (d1 == d2);
}int main()
{Date date1(2017, 8, 7);Date date2(2017, 8, 8);bool isValue = (date1 >= date2);cout << "date==========" << isValue << endl;return 0;
}

运行结果:date==========0

《C++ Primer》第14章 14.3节习题答案相关推荐

  1. 《C++ Primer》第9章 9.3节习题答案

    <C++ Primer>第9章 顺序容器 9.3节顺序容器操作习题答案 练习9.18:编写程序,从标准输入读取string序列,存入一个deque中.编写一个循环,用迭代器打印deque中 ...

  2. 《C++ Primer》第15章 15.4节习题答案

    <C++ Primer>第15章 面向对象程序设计 15.4节 抽象基类 习题答案 练习15.15:定义你自己的Disc_quote和Bulk_quote. [出题思路]本题练习实现不同折 ...

  3. 《C++ Primer》第15章 15.2节习题答案

    <C++ Primer>第15章 面向对象程序设计 本章介绍了面向对象程序设计的两个重要概念:继承和动态绑定,包括: □●继承.基类.派生类的基本概念. □●虚函数和虚基类. □●继承中的 ...

  4. 《C++ Primer》第13章 13.5节习题答案

    <C++ Primer>第13章 拷贝控制 13.5节 动态内存管理类 习题答案 练习13.39:编写你自己版本的StrVec,包括自己版本的reserve.capacity(参见9.4节 ...

  5. 《C++ Primer》第12章 12.3节习题答案

    <C++ Primer>第12章 动态内存 12.3节使用标准库:文本查询程序 习题答案 练习12.27:TextQuery和QueryResult类只使用了我们已经介绍过的语言和标准库特 ...

  6. 《C++ Primer》第5章 5.2节习题答案

    <C++ Primer>第5章 语句 5.2节 语句作用域 练习5.4:说明下列例子的含义,如果存在问题,试着修改它. (a)while(string::iterator iter != ...

  7. C++ Primer - 5th Edition - 书中源代码 - 课后习题答案

    C++ Primer - 5th Edition - 书中源代码 - 课后习题答案 C++ Primer - 5th Edition - 书中源代码 - 课后习题答案 1. C++ Primer, 5 ...

  8. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第4章 循环结构 课后习题答案

    浙大版<C语言程序设计>第四版(何钦铭颜晖) 第4章 循环结构 课后习题答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解, ...

  9. matlab第三章题目,第3章 MATLAB矩阵处理习题答案

    <第3章 MATLAB矩阵处理习题答案>由会员分享,可在线阅读,更多相关<第3章 MATLAB矩阵处理习题答案(3页珍藏版)>请在人人文库网上搜索. 1.第3章 MATLAB矩 ...

  10. 软件工程 科学出版社 郑逢斌主编 第1章 软件工程概述 课后习题答案

    软件工程 科学出版社 郑逢斌 第1章 软件工程概述 课后习题答案 1. 简述软件的发展过程. 2. 简述软件的定义和特点. 定义: 在 IEEE 软件工程词汇标准中,软件的定义是:软件是计算机程序.规 ...

最新文章

  1. Java多层的异常捕获
  2. static 成员小记
  3. 自旋波matlab计算,[首藏作品](4865)从电子到磁振子,自旋波计算开启新篇章...
  4. spring el表达式 if else_Spring 获取单例流程(二)
  5. kafka 主动消费_Kafka核心API——Consumer消费者
  6. ThinkPHP6项目基操(15.实战部分 阿里云短信redis)
  7. 10个必需的iOS开发工具和资源
  8. RDC出库财务计费逻辑
  9. django的form常用字段和参数
  10. EXCHANGE服务器灾难恢复
  11. php中的echo单引号_PHP 邮件漏洞小结
  12. 十大算法 — 插入排序法【C语言代码诠释】
  13. Python 自带性能强悍的标准库 itertools
  14. 计算机房属于学校场馆吗,校园常见火灾的预防和逃生安全知识
  15. Signature on Pocket PC
  16. workman 搭建tcp服务器,和websocket互相通信
  17. eclipse如何查看错误信息
  18. 找工作需要有工作经验,而没工作就没工作经验。如何理解这种死循环?
  19. 【C++】const与指针
  20. 计算机等级考试《二级Java语言程序设计》题库

热门文章

  1. NAND Flash硬件原理
  2. C#毕设asp.net江山旅游网站管理系统(论文+源码)
  3. php循环实现金字塔,PHP中使用循环实现的金字塔图形
  4. Xshell连接虚拟机linux
  5. QUASI-HYPERBOLIC (拟双曲线) MOMENTUM AND ADAM FOR DEEP LEARNING——精读
  6. 2021年美国联邦法定假日表
  7. 常吃14种食物清除身体垃圾
  8. linux xorg占用显存过大
  9. 限制输入框输入(数字、小数点、负号)
  10. 后端开发工程师技术导图