为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。
必须定义为普通成员函数
**赋值(=)、下标([])、调用(())、和成员箭头(->)**等操作符必须定义为成员。将这些操作符定义为非成员函数将在编译时标记为错误。
建议定义为成员函数的操作符
复合赋值操作符(+=/-=/*=//=)通常应定义为类的成员。
不一定非要这么做,如果定义非成员复合赋值操作符,不会出现错误。
改变对象状态或与给定类型紧密联系的其他一些操作符。
如自增、自减、解引用,通常应定义为类的成员。
IO操作符必须为非成员函数
因为当我们将IO操作符定义为成员函数后,左操作数只能是该类类型的对象。
在使用上跟我们常规时候的方式截然相反:
1 | // IO操作符为成员函数的时候方式 |
想要使用正常的使用方法,则左操作数必须为osteram类型。如果该操作符是类的成员,则它必须是osteram类的成员,但是osteram是标准库的组成部分,我们是不能为标准库中的类增加成员的。
建议定义为非成员函数的操作符
对称的操作符,如*算数操作符(+-/)、相等操作符(==)、关系操作符(><)和位操作(&)符**,最好定义为普通非成员函数。