//这节有些练习都重复了
14.1在什么情况下重载运算符与内置运算符有所区别?在什么情况重载的运算符又与内置类型一样?
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "world";
string t = s + "!";
string u = "hi" + s; // 重载的运算符要求左侧运算对象要求其是该类型
int i = 1;
double x = i + 2.0; // 而内置类型要求左侧运算对象可以转化成该类型即可
// 当左侧运算对象和右侧类型符合类的类型,重载与内置运算符一样
}
14.2 为Sales_data编写重载的输入、输出、加法和复合赋值运算符。
//重载输入输出运算符不加作用域,赋值和复合赋值加作用域
<pre name="code" class="cpp">std::istream& operator >> (std::istream &is, Sales_data &item)
{
double price;
is >> item.book_no >> item.book_sold >> price;
if (is) {
item.revenue = price*item.book_sold;
}
else {
item = Sales_data();
}
return is;
}
std::ostream& operator <<(std::ostream &os, const Sales_data &item){os << item.isbn() << " " << item.book_sold << " " << item.revenue << " " << item.avg_price();return os;}Sales_data& Sales_data::operator=(Sales_data &&item){if (this != &item) {book_no = item.book_no;book_sold = item.book_sold;revenue = item.revenue;}return *this;}Sales_data& Sales_data::operator+=(const Sales_data& rhs){book_no = rhs.isbn();book_sold += rhs.book_sold;revenue += rhs.revenue;return *this;}
练习14.3 string和vector都定义了重载的==比较各自的对象,假设svec1和svec2是存放string的vector,确定在下面的表达式中分别使用了哪个版本的==?
(a) "cobble" == "stone";
(b)svec1[0] == svec2[0];
(c)svec1 == svec2;
(d) "svec1[0]" == "stone";
//a d用了 T&&版本
//b c用了 const T&版本
练习14.4 如何确定下列运算符是否应该是类的成员。
(a) % 成员函数
(b) %= 复合赋值运算符一般来说应该是成员函数
(c) ++ 改变对象的状态应该是成员函数
(d) -> 箭头必须是成员函数
(e) << 输入输出运算符普通函数
(f) && 逻辑运算符一般不重载,一定要重载的话,关系运算符应该和普通函数
(g) == 具有对称性的运算符应该是普通函数
(h) () 调用必须是成员
练习14.7 在你的13.5节的练习(第470页)中曾经编写了一个String类,为它定义了一个输出运算符。
std::ostream& operator<<(std::ostream &os, const String &s)
{
os << s.str;
return os;
}
练习14.10 对于Sales_data的输入运算符来说如果给定了下面的输入将发什么情况?
(a) 0-201-99999-9 10 24.95 //成功输入一个对象,返回一个Sales_data
(b)10 24.95 0-201-99999-9 //输入发生错误,返回一个默认的Sales_data
练习14.11 下面的Sales_data输入运算符存在错误吗?如果有,请指出来。对于这个输入运算符如果仍然给定上个练习的输入将会发生什么情况?
std::istream& operator >> (std::istream &is, Sales_data &item)
{
double price;
is >> item.book_no >> item.book_sold >> price;
item.revenue = price*item.book_sold;
return is;
}
由于程序没有检验是否成功输入,对于(b)情况,输入了错误信息,会导致程序终止。