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

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


#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;
}

输出结果:



一切正常。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值