练习14.20:
复合赋值(加法):
//复合赋值运算符
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& 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)
{
Sales_date sum = h1;
sum += h2;
return sum;
}
练习14.21:
上面是+=执行实际的+操作,而+调用+=,本题代码如下(+=调用+),可以看出,本题实现方式性能上没有优势,且可读性较差:
//重载的加法运算符
Sales_date operator+(const Sales_date& h1, const Sales_date& h2)
{
if (h1.bookNo == h2.bookNo)
{
Sales_date sTemp;
sTemp.units_sold = h1.units_sold + h2.units_sold;
sTemp.revenue = h1.revenue + h2.revenue;
return sTemp;
}
else
{
throw runtime_error("bookNo is different");
}
}
//复合赋值运算符
Sales_date& Sales_date::operator+=(const Sales_date& s)
{
if (this->bookNo == s.bookNo)
{
*this = *this + s;
return *this;
}
else
{
throw runtime_error("bookNo is different");
}
}
练习14.22:
实现如下
//重载赋值运算符
Sales_date& Sales_date::operator=(const string& s)
{
bookNo = s;
return *this;
}
练习14.23:
//重构赋值运算符
StrVec& StrVec::operator=(std::initializer_list<std::string> ls)
{
//alloc_n_copy分配内存空间并从给定范围内拷贝元素
auto data = alloc_n_copy(ls.begin(), ls.end());
//销毁对象中的元素并释放内存空间
free();
//更新数据成员使其指向新空间
elements = data.first;
first_free = data.second;
return *this;
}
练习14.24:
略,与练习14.20,14.21类似
练习14.25:
略