a+++b

师兄考我的一个问题:
先看下面的这一个类的功能实现,++表示将类的数据的每一位都+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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值