练习14.20:
class Sales_data
{friend Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs);public:Sales_data &operator+=(const Sales_data &rhs);
}Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs)
{Sales_data sum = lhs;sum+=rhs;return sum;
}Sales_data &Sales_data::operator+=(const Sales_data &rhs)
{units_sold+=rhs.units_sold;revenue+=rhs.revenue;return *this;
}
练习14.21:
如练习14.14解答所述,本题的方式在性能上没有优势,可读性上也不好。
class Sales_data
{friend Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs);public:Sales_data &operator+=(const Sales_data &rhs);
}Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs)
{Sales_data sum = lhs;sum+=rhs;return sum;
}Sales_data &Sales_data::operator+=(const Sales_data &rhs)
{*this = (*this)+rhs;
}
练习14.22:
class Sales_data
{public:Sales_data &operator=(const Sales_data &isbn);
};Sales_data &Sales_data::operator=(const string &isbn)
{bookNo = isbn;return *this;
}
练习14.23:
暂时不会。
练习14.24:
在练习7.40中,我们编写了类Date,它只有3个int类型的数据成员,浅拷贝就能满足需求,因此不需要另外定义拷贝赋值和移动赋值运算符。
练习14.25:
class Date
{public:Date&operator=(const string &date);
}Date&Date::operator=(const string &date)
{istringstream in(date);char ch1,ch2;in>>year>>ch1>>month>>ch2>>day;if (!in || ch1!='-' || ch2!='-')throw std::invalid_argument("Bad date");if (month < 1|| month > 12 || day < 1||day > 31)throw std::invalid_argument("Bad date");return *this;
}