C++ primer 第十四章

 

1. 不能改变内置类型操作符的含义,也不能为内置类型添加新的操作符。如,不能定义接受两个数组类型操作数的 operator+ 。

 

2. 作为类成员的重载函数,this形参隐含作为第一个操作数,所以形参列表看起来会比操作数数目少1 。

 

3. 对于改变对象状态或者与给定类型紧密联系的操作符,如自增、自减、解引用,通常定义为成员函数。

赋值=、下标[]、调用()、成员访问->必须定义为成员,如果定义为非成员编译时会报错。

对于对称的操作符,或者不与某一对象紧密相连的操作符,如算数操作符、相等操作符、关系操作符和位操作符,通常定义为非类成员函数。

当定义为非类成员函数时,通常需要将该函数设置为所操作类的友元。

 

4. 加操作符返回的是一个【右值】,而复合赋值返回的是【对左操作数的引用】。

 

5. 短路求值:逻辑与和逻辑或操作符总是先计算其左操作数,如果仅依靠左操作数无法得到结果,再计算右操作数。

 

6. 不要重载具有内置含义的操作符,如:赋值操作符、取地址操作符、逗号操作符、逻辑与或等。

 

7. 对于用作关联容器键类型的类,应该定义<操作符。即使类只存储在顺序容器中,最好也该定义==和<操作符,因为很多算法用到这些操作符。如sort用到<操作符,find用到==操作符。

 

8. 如果类定义了==操作符,那也应该定义!=操作符,类用户会假设如果可以进行相等比较,那么也可以进行不等比较。同样,如果定义了<,那应该同时定义<、<=、>、>=四种操作符。

 

9. 为了与IO标准库一致,重载<<时,应该接受ostream&(因为无法复制ostream对象)作为第一个形参,对类类型的const对象的引用作为第二个形参,返回ostream&。

重载>>时,接收istream&作为第一个形参,对类类型的非const对象的引用作为第二个形参,返回istream&。重载<<必须处理错误和文件结束的可能性。

如果输入检测到失败,那么要确保对象处于可用和一致的状态。比如读取数据到对象中时失败,那么最好将这个对象置为空,防止出现错误。

 

10. 定义下标操作符时,一般需要定义两个版本,一个为非const成员并返回引用,另一个为const成员并返回const引用。

 

11. 区别操作符的前缀形式和后缀形式。

因为前缀式和后缀式有同样的形参,所以普通重载无法区分。为了解决这一问题,后缀式操作符接受一个额外的无用int形参。使用后缀式操作符时,编译器提供0作为这个形参的实参。

 

12. 函数对象:定义了调用操作符()的类,通常称为函数对象,因为他们的行为类似于函数。通常用于定义与标准算法结合的谓词函数。

 

13. 函数适配器:用于特化和扩展一元和二元函数对象,有绑定器和求反器两种。

绑定器:通过将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。有两种绑定器:

bind1st:绑定第一个实参。

bind2nd:绑定第二个实参。

求反器:将谓词函数对象的真值求反。有两种求反器:not1和not2。

 

14. 转换操作符: 特殊的类成员函数。将该类类型值转换为其他类型值。

声明形式:operator TYPE(); //TYPE表示要转换成的类型,声明没有形参,不定义返回值

除了void外,所有可作为函数返回类型的类型都可以作为转换函数的目标。

转换函数一般不应该改变被转换的对象。因此,转换操作符通常定义为const。

 

15. 类类型转换后,不可以再跟另一个类型转换,否则会报错。

 

16. 避免二义性: 保证最多只有一种途径,可以将一个类型转换为另一类型。做到这一点,最好的方法是限制转换操作符的数目,尤其是到一种内置类型应该只有一个转换。同时,定义一个类到两种及两种以上内置类型的转换是不好的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章