选择成员或非成员实现
为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序员没有选择,操作符必须是成员;在另一些情况下,有些经验原则可指导我们做出决定。下面是一些指导原则,有助于决定将操作符设置为类成员还是普通非成员函数:
1.赋值(=)、下标([])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。
2.像赋值一样,复合赋值操作符通常定义为类的成员,与赋值不同的是,不一定非得这样做,如果定义为非成员复合赋值操作符,不会出现编译错误。
3.改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减和解引用,通常就定义为类成员。
4.对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。
下面给出一些说明:
重载操作符一般定义如下
class Example {
friend std::istream& operator>>(std::istream&, Example&);
friend std::ostream& operator<<(std::ostream&, const Example&);
public:
Example& operator+=(const Example&);
int num;
};
Example operator+(const Example&, const Example&);
赋值操作符
因为赋值返回一个引用,所以不需要创建和撤销结果的临时副本,返回值通常是左操作数的引用
Example& Example::operator+=(const Example& rhs)
{
num += rhs.num;
return *this;
}
下标操作符
class Foo {
public:
int &operator[] (const size_t);
const int &operator[] (const size_t) const;
private:
vector data;
};
如下实现:(未做范围检测)
int& Foo::operator[] (const size_t index)
{
return data[index];
}
const int& Foo::operator[](const size_t index) const
{
return data[index];
}
前自增自减操作符
为了与内置类型一致,前缀式操作符应返回被增量或减量对象的引用
Example& operator++();
Example& operator--();
后自增自减操作符
为了与内置类型一致,后缀式应返回旧值,并作为值返回,而不是引用,参数用于区分后置,并没有其他意义。
Example operator++(int);
Example operator--(int);
IO操作符必须为非成员函数
当定义符合标准库iostream规范的输入或输出操作符的时候,必须使它成为非成员操作符,否则左操作数将只能是该类类型的对象:
//如果 操作符 << 是 Example的成员
Example exp;
exp << cout;
显然这个用法与正常的使用方式相反
输出操作符
为了与IO标准库一致,操作符应接受ostream& 作为第一个形参,对类类型const对象的引用作为第二个形参,并返回对ostream形参的引用
ostream& operator<<(ostream& os, const Example& e)
{
os << e.num;
return os;
}
输入操作符(未做输入检测)
istream& operator>>(istream& in, Example& e)
{
in >> e.num;
return in;
}
阅读(3135) | 评论(0) | 转发(1) |