- 明智的使用操作符重载可以使类类型的使用像内置类型一样直观。
- 重载操作符必须具有至少一个类类型或枚举类型的操作数,这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。
- 重载操作符并不保证操作数的求值顺序,尤其是,不会保证内置逻辑AND、逻辑OR和逗号操作符的操作数求值,在&&和||的重载版本中,两个操作数都要进行求值,而且对操作数的求值顺序不作规定,因此,重载&&、||或逗号操作符不是一种好的做法。
- 一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员。
- 操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。
- 将要用作关联容器键类型的类应该定义<操作符。关联容器默认使用键类型的<操作符。即使该类型将只存储在顺序容器中,类通常也应该定义==和<操作符,理由是许多算法假设这些操作符存在,例如sort使用<,而find使用==操作符。
- 如果类定义了相等操作符,它也应该定义!=,同样的规则也应用于其他关系操作符,如果定义了<,则也应该定义>,>=,<,<=。
- 赋值,下标,调用和成员访问箭头等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误
- 像赋值一样,复合赋值操作符通常应定义为类的成员,与赋值不同的是,不一定非得这样做,如果定义为非成员复合赋值操作符,不会出现编译错误。
- 改变对象状态或与给定类型紧密联系的其他一些操作符,如自增,自减和解引用,通常为类的成员
- 对称的操作符,如算术操作,相等操作等等,最好定义为普通非成员函数。
- ostream& operator <<(ostream& os,const ClassType &object),当定义符合标准库iostream规范的输入或输出操作符的时候,必须使它成为非成员操作符,否则,左操作数将只能是该类类型的对象。此外,IO操作符通常对非公用数据成员进行读写,因此,类通常将IO操作符设为友元。
- 更重要但通常重视不够的是,输入和输出操作符如下区别:输入操作符必须处理错误和文件结束的可能性。
- 赋值操作符可以重载,无论形参为何种类型,赋值操作符必须定义为成员函数。这一点和复合赋值操作符有所不同(复合的可以定义为非成员函数)。
- 类定义下标操作符时,一般需要定义两个版本:一个为非const成员并返回引用,另一个为const成员并返回const引用。
- 像下标操作符一样,我们需要解引用操作符的const和非const版本。它们的区别在于返回类型:const成员返回const引用以防止用户改变基础对象。
- 重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。
- 为了与内置类型一致,前缀式操作符应该返回被增量或减量对象的引用
- 后缀式操作符函数接受一个额外的int型形参,以示区分前缀
- 为了与内置操作符一致,后缀式操作符应返回旧值,并且,应作为值返回,而不是返回引用。
C++ 重载操作符与转换
最新推荐文章于 2022-05-01 13:16:54 发布