本文主要是介绍一道亚信联创笔试题--双目运算符的重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
昨天做了亚信联创实习生的笔试,其中有一道题引发了讨论,代码大概如下:
#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值为0cout << "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;
}
输出结果:
一切正常。
这篇关于一道亚信联创笔试题--双目运算符的重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!