14.20
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 sum = rhs;
sum += lhs;
return sum;
}
14.21 operator+要被定义为友元,可读性差
Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs;
sum.units_sold += rhs;
sum.revenue += rhs.revenue;
return sum;
}
Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{
*this = (*this) + rhs;
return *this;
}
14.22
Sales_data& Sales_data::operator=(const string &s)
{
bookNo = s;
return *this;
}
14.23
StrVec& StrVec::operator=(initializer_list<string> il)
{
auto newdata = alloc_n_copy(il.begin(), il.end());
free();
elements = newdata.first;
first_free = newdata.second;
cap = newdata.second;
return *this;
}
14.24 Date类有3个int的成员,使用合成的拷贝赋值运算符即可。
14.25 定义一个赋值运算符,把string赋值给Date
Date& Date::operator=(const string &s)
{
istringstream in(s);
in >> year >> month >> day;
if (!in)
*this = Date();
return *this;
}
14.26 StrBlob:
string& StrBlob::operator[](size_t n)
{
check(n, "out of range");
return (*data)[n];
}
const string& StrBlob::operator[](size_t n) const
{
check(n, "out of range");
return (*data)[n];
}
StrBlobPtr:
string& StrBlobPtr::operator[](size_t n)
{
auto p = check(n, "out of range");
return (*p)[n];
}
const string& StrBlobPtr::operator[](size_t n) const
{
auto p = check(n, "out of range");
return (*p)[n];
}
StrVec:
string& operator[](size_t n) { return elements[n]; }
const string& operator[](size_t n) const { return elements[n]; }
String:
char& operator[](size_t n) { return p[n];}
const char& operator[](size_t n) const { return p[n];}