练习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;
}