operator运算符的重载问题

来源:互联网 发布:大阪 知乎 编辑:程序博客网 时间:2024/05/22 02:28

从侯捷老师的书上看到,如果重载运算符作为成员函数在类内定义的话,会出现一些问题,比如在类内定义了: T operator+(const T &)const 由于是类内的成员函数,使用时:T t1(10) ; t1=t1+3 ; 这种使用不会出现问题,调用等效于t1.operator+(3),至于原因,我只说一下结论,当参数被列与参数列内,这个参数才是隐式类型转换的合格参与者。类会为2建立一个临时T对象,当然前提是这个只涉及到non-explicit构造函数。

#include<iostream>using namespace std;class fraction {    int a;public:    fraction(int _a) :a(_a) {}    fraction() {};    int num()const { return a; }    void print() { cout << a; }};const fraction operator+(const fraction &_a,const fraction  &_b) {    return fraction(_a.num() + _b.num());}int main(void) {    fraction a(1);    fraction b;    b = a + 2;    b.print();    b = 2 + a;    b.print();    system("pause");    return 0;}

——————————————2017.12.18更新—————————————–

加入一句话:

始用函数重载来消除类型转换,你就有可能这样声明函数,把自己陷入危险之
中:
const UPInt operator+(int lhs, int rhs); // 错误!

这个想法是合情合理的。对于 UPInt 和 int 类型,我们想要用所有可能的组合来重载
operator 函数。上面只给出了三种重载函数,唯一漏掉的是带有两个 int 参数的 operator,
所以我们想把它加上。

有道理么?在 C++中有一条规则是每一个重载的 operator 必须带有一个用户定义类型
(user-defined type)的参数。int 不是用户定义类型,所以我们不能重载 operator 成为
仅带有此[int]类型参数的函数。(如果没有这条规则,程序员将能改变预定义的操作,这样
做肯定把程序引入混乱的境地。比如企图重载上述的 operator,将会改变 int 类型相加的
含义。)

原创粉丝点击