14.13 还可定义一个减法运算符:
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 sub = lhs;
sub -= rhs;
return sub;
}
14.14 用代码复用是较好的方式。
14.15 定义的Date类不需要进行算术运算。
14.16 StrBlob和StrBlobPtr:
bool operator==(const StrBlob &lhs, const StrBlob &rhs)
{
return lhs.data == rhs.data;
}
bool operator!=(const StrBlob &lhs, const StrBlob &rhs)
{
return !(lhs == rhs);
}
bool operator==(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{
return eq(lhs, rhs);
}
bool operator!=(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{
return neq(lhs, rhs);
}
StrVec:
bool operator==(const StrVec &lhs, const StrVec &rhs)
{
if (lhs.size() != rhs.size())
return false;
for (auto iter1 = lhs.begin(), iter2 = rhs.begin(); iter1 != lhs.end(); ++iter1, ++iter2) {
if (*iter1 != *iter2)
return false;
}
return true;
}
bool operator!=(const StrVec &lhs, const StrVec &rhs)
{
return !(lhs == rhs);
}
String:
bool operator==(const String &s1, const String &s2)
{
if (strcmp(s1.p, s2.p) == 0)
return true;
else
return false;
}
bool operator!=(const String &s1, const String &s2)
{
return !(s1 == s2);
}
14.17 Date类的相等和不等运算符:
bool operator==(const Date &d1, const Date &d2)
{
return d1.year == d2.year && d1.month == d2.month && d1.day == d2.day;
}
bool operator!=(const Date &d1, const Date &d2)
{
return !(d1 == d2);
}
14.18 StrBlob:
bool operator<(const StrBlob &lhs, const StrBlob &rhs)
{
return *lhs.data < *rhs.data;
}
bool operator>(const StrBlob &lhs, const StrBlob &rhs)
{
return *lhs.data > *rhs.data;
}
bool operator<=(const StrBlob &lhs, const StrBlob &rhs)
{
return *lhs.data <= *rhs.data;
}
bool operator>=(const StrBlob &lhs, const StrBlob &rhs)
{
return *lhs.data >= *rhs.data;
}
StrBlobPtr:
bool operator<(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{
auto l = lhs.wptr.lock(), r = rhs.wptr.lock();
if (l == r) {
if (!r)
return false;
return (lhs.curr < rhs.curr);
} else {
return false;
}
}
bool operator>(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{
return !((lhs < rhs) || (lhs == rhs));
}
bool operator<=(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{
return !(lhs > rhs);
}
bool operator>=(const StrBlobPtr &lhs, const StrBlobPtr &rhs)
{
return !(lhs < rhs);
}
StrVec:
bool operator<(const StrVec &lhs, const StrVec &rhs)
{
for (auto iter1 = lhs.begin(), iter2 = rhs.begin();
iter1 != lhs.end() && iter2 != rhs.end();
++iter1, ++iter2) {
if (*iter1 < *iter2)
return true;
if (*iter1 > *iter2)
return false;
}
if (lhs.size() < rhs.size())
return true;
return false;
}
bool operator>(const StrVec &lhs, const StrVec &rhs)
{
return !((lhs < rhs) || (lhs == rhs));
}
bool operator<=(const StrVec &lhs, const StrVec &rhs)
{
return !(lhs > rhs);
}
bool operator>=(const StrVec &lhs, const StrVec &rhs)
{
return !(lhs < rhs);
}
String:
bool operator<(const String &s1, const String &s2)
{
return strcmp(s1.p, s2.p) < 0;
}
bool operator>(const String &s1, const String &s2)
{
return strcmp(s1.p, s2.p) > 0;
}
bool operator<=(const String &s1, const String &s2)
{
return !(s1 > s2);
}
bool operator>=(const String &s1, const String &s2)
{
return !(s1 < s2);
}
14.19 Date类比较:
bool operator<(const Date &d1, const Date &d2)
{
return (d1.year < d2.year) ||
(d1.year == d2.year && d1.month < d2.month) ||
(d1.year == d2.year && d1.month == d2.month && d1.day < d2.day);
}
bool operator<=(const Date &d1, const Date &d2)
{
return (d1 < d2) || (d1 == d2);
}
bool operator>(const Date &d1, const Date &d2)
{
return !(d1 <= d2);
}
bool operator>=(const Date &d1, const Date &d2)
{
return !(d1 < d2);
}