关闭

c++学习(二)——重载操作符与转换

1472人阅读 评论(0) 收藏 举报

把学习C++primer的感受写下来,哪怕是照着抄,也要慢慢吃透。发现瞪着两只眼睛看,效果就是眼球发酸,瞌睡,把笔动起来,对学习是有好处的。写的同时,脑子也会跟着思考。不瞌睡。妙法——从效率上讲还是比较快的。

重载操作符与转换

通过操作符重载,能够针对类类型的操作数定义不同的操作符版本。

一、重载操作符的定义 

重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。重载操作符具有返回类型和形参表,如下语句:

Sales_item operator+(const Sales_item&, const Sales_item&);

除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同。函数调用操作符可以接受任意数目的操作数。

不能重载的操作符包括“::”,“.*”,“.”,“?:”

还有重载操作符必须具有一个类类型操作数。用于内置类型的操作符,其含义不能改变。例如,内置的整型加号操作符不能重定义。

// error: can not redefine built-in operator for ints

int operator+(int, int);

也不能为内置数据类型重定义加号操作符。

重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。

加强记忆:重载操作符必须具有一个类类型操作数。

操作符的优先级、结合性或操作数数目不能改变,不管操作数的类型和操作符的功能定义如何。

重载操作符并不保证操作数的求值顺序,尤其是,不会保证内置逻辑AND、逻辑OR和逗号操作符的操作数求值。

重载这些&&、||或逗号操作符不是一种好的做法。

大多数重载操作符可以定义为普通非成员函数或类的成员函数。

作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。

重载一元操作符如果作为成员函数就没有显式形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时就有一个形参,定义为非成员函数时,有两个形参。

操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。

使用重载操作符可以隐式调用也可以显式调用。

调用成员操作符函数与调用其它任意函数一样:指定运行函数的对象,然后使用点或箭头操作符获取希望调用的函数。

重载操作符的设计

1、不要重载具有内置含义的操作符。

重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法,这些操作符具有有用的内置含义。如果我们定义了自己的版本,就不能使用这些内置含义了。

2、大多数操作符对类对象没有意义。

设计类的时候,应该确定要支持哪些操作符。

为类设计操作符,最好的方式是先设计类的公用接口。定义了接口之后,就可以考虑应将那些操作符定义为重载操作符。

3、符合赋值操作符

如果一个类有算数操作符或位操作符,那么提供相应的复合赋值操作符一般是一个好的做法。

4、相等和关系操作符

如果类定义了相等操作符,它也应该定义不等操作符。类用户会假设如果可以进行相等比较,则也可以进行不等比较。同样的规则也应用于其它关系操作符。

5、选择成员或非成员实现

为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序员没有选择,操作符必须是成员;在另一些情况下,有些经验原则可指导我们做出决定。

一些指导原则:

(1)赋值、下标、调用和成员访问箭头灯操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。

(2)像赋值一样,复合赋值操作符通常应定义为类的成员。

(3)改变对象状态或与给定类型紧密联系的其他一些操作符,通常应定义为类成员。

(4)对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34792次
    • 积分:580
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:0篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论