您的位置:控制工程论坛网论坛 » 嵌入式系统 » 运算符重载的特殊性

happem

happem   |   当前状态:在线

总积分:70  2024年可用积分:0

注册时间: 2012-08-23

最后登录时间: 2012-09-11

空间 发短消息加为好友

运算符重载的特殊性

happem  发表于 2012/8/23 13:44:53      1454 查看 0 回复  [上一主题]  [下一主题]

手机阅读

C++/C都有一套固定的运算符集合,其中不乏比较特殊的运算符例如‘++’和‘—’虽说本质上运算符重载和函数重载没什么不同,但是还是有一些特殊性需要注意:

1.         如果重载成为成员函数,则this对象发起对它的调用。

2.         如果重载为全局函数,则第一个参数发起对它的调用。

3.         禁止用户发明该语言运算集合中不存在的运算符。

4.         除了函数调用运算符‘()’外,其他运算符函数重载函数不能有默认参数值。

5.         不要试图改变重载运算符的语义,要与其内置语义保存一致。如果你把‘++’运算符重载后让它执行递减操作,重载‘<<=’和‘>>=’执行I/O操作等,都会损害程序的可理解性,得不偿失。

6.         某些运算符之间可以相互推导,比如在逻辑运算符之间和关系运算符之间,这样我们可以只实现少数几个运算符,然和在用它们来实现其他运算符。

例如,我们可以用‘!’和‘&&’来实现‘||’我们也可以用‘<’来实现‘==’、 ‘>’、 ‘>=’、 ‘<=’、 ‘!=’、或者单独实现‘==’、然和和‘<’、组合来实现其他运算符等。

不能重载的运算符

 在C++运算符集合中,有一些运算符是不允许重载的,一方面是因为它们的右侧操作数是一个名字而不是对象,另一方面是出于安全性的考虑,可防止产生错误和混乱。

l         不能重载‘。’,因为它在ADT/UDT中对任何成员都有意义,已成为标准用法。

l         不能重载反引用类成员指针。‘*’。

l         不能重载作用域解析运算符。‘::’;

l         不能重载那个唯一的三元运算符——条件运算符‘?:’;

l         不能重载sizeof()和typeid();

l         不能重载C++的新式类型转换运算符:static_cast<>、dynamic_cast<>、const_cast<>、reinterpret_cast<>。

l         不能重载‘#’和‘##’等预处理操作符。

资源来自:http://www.lirenedu.org/index.php?ack=xinwen&id=1185 

1楼 0 0 回复