运算符重载

来源:互联网 发布:linux分区方案 知乎 编辑:程序博客网 时间:2024/04/30 14:29
在C++内置数据类型中(char,int,float,double等),每一种类型都可进行运算符操作,例如:加减乘除运算。
对于用户自定义的数据类型,只能自己进行运算符重载,赋予它们类似内置数据类型加减乘除等的意义。
相对于函数调用,运算符重载的目的是使程序更容易阅读,书写和理解。
运算符重载虽然好用,但不能随便用,因为运算符重载赋予运算符在不同情况下的不同功能,滥用反而导致混乱。
例如:将*操作符用于地址,将得到存储在这个地址中的值(解引用);但将它用于两个数字时,得到的将是它们的乘积。也可以将加号赋予减号的意义。
我想:对运算符重载一个很好的应用是智能指针(比如shared_ptr),智能指针重载了"->"和".",从而实现和源指针一样的视觉效果。

运算符重载的实现有两种:
1. 类成员函数
   (一元运算符最好用类成员运算符重载)
2. 友元函数
   (输入、输出流是一个很好的例子)
   
当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。
原因是:
重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。
而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 

以前我对运算符重载很头疼,原因在于:
1.调用省去了operator,参数又不确定,感情上很难接受;
2.隐式转换,发生在悄然无息之间,常常不知道发生了什么。
  (关于运算符隐式转换,参考“自定义类型转换函数”)
   
关于运算符重载,网络上资料很多,我在这里做个记号,有时间再好好研究一下。
0 0
原创粉丝点击