[]关于Sales_item类中操作符==的重载

[求助]关于Sales_item类中操作符==的重载
各位大侠:
        大家好,我一边看《C++ primer》第4中文版,一边实操(编译器版本是vs2010)。看到第14章 重载操作符与转换,对于Sales_item类中操作符==的重载有些疑问,麻烦大侠给解析一下,谢谢,非常感谢。

        1. 书中提到操作符==的重载应定义为非成员函数,但是非成员函数无法访问数据成员,所以数据成员就得定义为公共,这样是否会影响数据的封装呢?

        2. 如果数据成员必须是私有的,那么操作符==的重载应该定义为成员函数,还是友元,或者其他,各位大侠有没有更好的经验?

Sales_item类的头文件代码如下:

#ifndef SALESITEM_H
#define SALESITEM_H
#include <iostream>
#include <string>
 
class Sales_item
{
public:
Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){}
Sales_item(std::istream &is){ is >> *this;}
friend std::istream& operator>>(std::istream &,Sales_item &);
friend std::ostream& operator<<(std::ostream &,const Sales_item &);
public:
Sales_item & operator+=(const Sales_item&);
public:
double avg_price() const;
bool same_isbn(const Sales_item &rhs)const
{
return isbn == rhs.isbn;
}
Sales_item():units_sold(0),revenue(0.0){}
public:
std::string isbn;
unsigned units_sold;
double revenue;
};
 
using std::istream;
using std::ostream;
Sales_item operator+(const Sales_item &,const Sales_item &);
inline bool operator==(const Sales_item &lhs,const Sales_item &rhs)
{
return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.same_isbn(rhs);
}
inline bool operator!=(const Sales_item &lhs,const Sales_item &rhs)
{
return !(lhs == rhs);
}
 
inline Sales_item & Sales_item::operator +=(const Sales_item &rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
inline Sales_item operator+(const Sales_item &lhs,const Sales_item &rhs)
{
Sales_item ret(lhs);
ret += rhs;
return ret;
}
inline istream& operator>>(istream &in,Sales_item &s)
{
double price;
in >> s.isbn >> s.units_sold >> price;
if(in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}
inline ostream& operator<<(ostream &out,const Sales_item &s)
{
out << s.isbn << "\t" <<s.units_sold << "\t" << s.revenue << "\t" << s.avg_price();
return out;
}
inline double Sales_item::avg_price() const
{
if(units_sold)
return revenue/units_sold;
else
return 0;
}
#endif


谢谢,非常感谢。
------解决思路----------------------
重载操作符,最好是用成员函数(public),也可定义为友元,个人建设最好不要用友元,破坏封装性。
------解决思路----------------------
1. operator==  最好定义为非成员函数,这样才能在左操作数上进行自动的类型转换。 比如 std::string x = "1", 如果 std::string 的 operator== 定义成了成员函数,那么  x == "1" 可以编译, "1"  == x 编译就会失败。
2. 最好类提供一个 public 的 compair  成员函数,operator== 中调用这个函数来实现。 其次是把 operator== 定义成友元。把 private 的数据成员改成 public 是最差的做法。

关于各种操作符是否定义成成员函数的建议:http://www.adintr.com/myarticle/operator.html
------解决思路----------------------
引用:
1. operator==  最好定义为非成员函数,这样才能在左操作数上进行自动的类型转换。 比如 std::string x = "1", 如果 std::string 的 operator== 定义成了成员函数,那么  x == "1" 可以编译, "1"  == x 编译就会失败。
2. 最好类提供一个 public 的 compair  成员函数,operator== 中调用这个函数来实现。 其次是把 operator== 定义成友元。把 private 的数据成员改成 public 是最差的做法。

关于各种操作符是否定义成成员函数的建议:http://www.adintr.com/myarticle/operator.html


补充一点,一个大于返回1,小于返回-1,相等返回0的 compaire 函数,除了可以用于实现 operator==外,还可以用于实现 >, <, >=, <=, != 这一系列的比较操作

------解决思路----------------------
一般情况下,一元运算符重载为类成员函数,二元运算符重载为非成员的友元函数
------解决思路----------------------
A binary operator shall be implemented either by a non-static member function (9.3) with one parameter
or by a non-member function with two parameters, 既然是初学者,每种都试试,比较一下优缺点,不要刚开始就束手束脚,
这也不用,那也不要用, 很没乐趣
------解决思路----------------------
1. 数据成员仍可以是私有,只要提供公有的访问接口即可。
2. 成员友元都可以。为了对称性,非成员看起来舒服一些。