首页 > 其他 > 详细

a+++b

时间:2015-03-24 01:42:36      阅读:232      评论:0      收藏:0      [点我收藏+]
师兄考我的一个问题:
先看下面的这一个类的功能实现,++表示将类的数据的每一位都+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也是这样考虑的,注意到优先级:后置++ > 前置++ = +,即+和前置++的优先级是一样的,但是都比后置++低。

a+++b

原文:http://blog.csdn.net/u012925008/article/details/44576115

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!