昨天做了亚信联创实习生的笔试,其中有一道题引发了讨论,代码大概如下:
#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;
}
输出结果:
一切正常。