师兄考我的一个问题:


先看下面的这一个类的功能实现,++表示将类的数据的每一位都+1,不进位处理,返回一个整数(处理后的数据), +表示两个类相加,将其每一位都相加,同样不进位处理,返回计算结果为整数。
代码实现:
testmain.cpp:
#include <iostream>
#include "strange_plus.h"
using namespace std;
int main() {
integer a, b;
int t1, t2, ans;
t1 = a + b;
t2 = ++a;
cout << t1 << endl;
cout << t2 << endl;
ans = a+(++b);
cout << ans << endl;
return 0;
}
strange_plus.h:
#include <string.h>
class integer {
public:
integer() {
data = 1;
}
~integer() {}
friend int operator + (const integer i1, const integer i2) {
int temp1 = i1.data;
int temp2 = i2.data;
int temp3 = 0;
int ans = 0;
while (temp1 || temp2) {
temp3 = temp3 * 10 + ((temp1 % 10 + temp2 % 10) % 10);
temp1 /= 10;
temp2 /= 10;
}
while (temp3) {
ans = ans * 10 + temp3 % 10;
temp3 /= 10;
}
return ans;
}
int operator ++ () {
int temp[10];
memset(temp, 0, sizeof(temp));
int temp_int = data;
int i = 0;
while (temp_int) {
temp[i++] = temp_int % 10;
temp_int /= 10;
}
for (int j = 0; j < i; j++) {
temp[j] = (temp[j] + 1) % 10;
}
int ans = 0;
for (int j = i - 1; j >= 0; j--) {
ans = ans * 10 + temp[j];
}
data = ans;
return ans;
}
private:
int data;
};
然后报错了,看错误信息:
看的不是很懂,但是发现一个挺奇怪的地方,假如在
strange_plus.h中加上这个:
integer(int temp) {data = temp;}
就可以运行了:
分析如下:
首先对于a+(++b),先算好了++b,返回一个整数,对与这个整数,它是无法和类相加的,而添加了
integer(int temp) {data = temp;}这一段代码之后,就可以将整数转成类,进行相加;
其实这个现象就是函数的静态绑定规则,之前也讲过:
这里就是第三步了,这么看来,构造函数
integer(int temp) {data = temp;}相当于强制转化了。
同样的,假如++改成后置的,a+(++b)改成a+++b也是这样考虑的,注意到优先级:后置++ > 前置++ = +,即+和前置++的优先级是一样的,但是都比后置++低。