一道亚信联创笔试题--双目运算符的重载

来源:互联网 发布:川大锦江学院淘宝地址 编辑:程序博客网 时间:2024/04/29 13:39

昨天做了亚信联创实习生的笔试,其中有一道题引发了讨论,代码大概如下:


#include <iostream>using namespace std;class integer{    public:        integer(int value=0):value(value){}        integer operator+(integer itg) {//双目运算符用成员函数重载            return value+=itg.value;//返回值使用+=符号        }        friend ostream& operator<<(ostream& os,integer& it){            return os << it.value;        }       private:        int value;};int main(){    integer i;//i值为0    cout << "i=" << i << endl;    integer ii; //ii值为0
    ii = i+2;//这里会使得i和ii的值都变成2,因为之前+号重载时使用的return value+=it.value 这种形式    ii = 2+i;//这一行将出现编译错误,因为没有前置加号的形式被重载    cout << "i=" << i << endl;    cout << "ii=" << ii << endl;    return 0;}

        不难发现本身是一个很简单的程序,只是单纯写了一个整形的类,然后输出来,但是题目里面+号运算符重载时使用的成员函数形式的重载,这回导致使用时只能让加号处于变量身后,而不是放在变量之前的问题;错误如图:


        其次就是重载+号时,返回值return 使用的value+=it.value,这样会改变当前对象的value值,使得i 和ii的值都变为2,显然这不是我们想要的结果。

        实际上,在运算符重载在,友元函数运算符重载函数与成员运算符重载函数的区别是:友元函数没有this指针,而成员函数有,因此,在两个操作数的重载中友元函数有两个参数,而成员函数只有一个。且不能用友元函数重载的符号有:“=,(),[],->”记住,成员函数必须是符号的做操作数。

        对于单目运算符,通常用成员函数,来的简便

        双目运算符,通常用友元函数,没有操作数左右的限制

        对于运算符” =,(),[],->”只能作为成员函数。


于是做修改如下:



#include <iostream>using namespace std;class integer{    public:        integer(int value=0):value(value){}        /*integer operator+(integer itg) {            return value+=itg.value;        }*/        friend integer operator+(const integer& a,const integer& b){             return a.value+b.value;        }        friend ostream& operator<<(ostream& os,const integer& it){            return os << it.value;        }    private:        int value;};int main(){    integer i;    cout << "初始值i=" << i << endl;    integer ii;     ii = i+2;    ii = 2+i;    cout << "相加之后i=" << i << endl;    cout << "ii=" << ii << endl;    return 0;}

输出结果:



一切正常。



0 0