a+++b

来源:互联网 发布:八维网络工程学院 编辑:程序博客网 时间:2024/06/06 08:50
师兄考我的一个问题:
先看下面的这一个类的功能实现,++表示将类的数据的每一位都+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也是这样考虑的,注意到优先级:后置++ > 前置++ = +,即+和前置++的优先级是一样的,但是都比后置++低。
0 0