C++重载——前置操作符和后置操作符重载

本文参照于狄泰软件学院,唐佐林老师的——《C++深度剖析教程》

思考:“i++“ 和 ”++i“有区别吗?为什么?

我们通过反汇编验证一下想法:

16            int i = 0;
0804869d:   movl $0x0,0x1c(%esp)
18            i++;
080486a5:   addl $0x1,0x1c(%esp)
20            ++i;
080486aa:   addl $0x1,0x1c(%esp)

我们可以发现:i++和++i所对应的汇编代码是一样的。
这实际上是编译器帮我们做了优化:
1. 现代编译器产品会对代码进行优化
2. 优化使得最终的二进制程序更加高效
3. 优化后的二进制程序丢失C/C++的原生语义
4. 不可能从编译器后的二进制程序还原C/C++程序。

重载后的前置操作符和后置操作符

思考:++操作符可以重载吗?如何区分前置++和后置++?

  1. 后置++的意义为:将变量的值作为返回值,然后变量自增1;
  2. 前置++的意义为:将变量的值自增1,然后变量的值作为返回值。
    那么我们该如何实现++操作符的重载函数呢?

示例代码:++操作符的重载

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int mValue;
public:
    Test(int i)
    {
        mValue = i;
    }

    int value()
    {
        return mValue;
    }

    Test& operator ++ ()
    {
        ++mValue;

        return *this;
    }

    Test operator ++ (int)
    {
        Test ret(mValue);

        mValue++;

        return ret;
    }
};

int main()
{
    Test t1(0);
    Test t2(0);

    t1++; 
    cout << "++t1; = " << t1.value() << endl;

    ++t2;
    cout << "++t2; = " << t2.value() << endl;

    Test t3 = t1++;
    cout << "Test t3 = t1++; = " << t3.value() << endl;

    Test t4 = ++t2;
    cout << "Test t4 = ++t2; = " << t4.value() << endl;

    return 0;
}

输出结果:
++t1; = 1
++t2; = 1
Test t3 = t1++; = 1
Test t4 = ++t2; = 2

分析:
1. 全局函数和成员函数均可进行重载++操作符
2. 重载前置++操作符不需要额外的参数
3. 重载后置++操作符需要一个int类型的占位参数

问题:那么重载后和重载前有什么区别呢?

(1) 对于基础类型的变量
1. 前置++的效率和后置++的效率基本相同
2. 根据项目中编码规范进行选择

(2) 对于类类型的对象
1. 前置++的效率高于后置++
2. 尽量使用前置++操作符提高程序效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值