首页 > 其他 > 详细

第40课.前置操作符和后置操作符

时间:2019-11-23 12:55:17      阅读:80      评论:0      收藏:0      [点我收藏+]

前置操作符: ++i; --i;
后置操作符: i++; i--;

1.i++和++i和区别?

下面的代码有没有区别?为什么?

i++;
++i;    //注:与j = i++; 有区别

在工程中,独立的这两行语句是完全一样的没有差异(从汇编代码去看)。原因是,编译器的优化,这样做更高效。

对于基础类型的变量(未重载)

a.两行语句是完全一样的没有差异(从汇编代码去看)
b.前置++的效率与后置++的效率基本相同

对于类类型的对象(重载)

a.两者完全不一样
b.前置++的效率高于后置++

2.前者操作符和后置操作的重载

a.全局函数和成员函数均可进行重载(推荐成员函数重载)
b.重载前置(++, --)操作符不需要额外的参数
c.重载后置(++, --)操作符需要一个int类型占位参数

eg:

#include <iostream>
#include <string>

using namespace std;

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

    Test& operator ++ ()            // Test& 这里使用引用没有问题,因为这里返回的是主函数里定义的当前对象。它只会在主函数结束时才被释放
    {
        ++mValue;
        
        return *this;
    }
    
    Test operator ++ (int)          // Test 这里返回的是Test对象。是因为。这里定义了一个局部对象,我们需要返回的值存储在局部对象中。所以我们
                                    // 需要直接返回这个对象。而不能返回引用(引用的局部对象会在return的时候,被释放。这样引用就错误了)。
                                    // 如果这里返回this对象的话,就无法实现后置++的功能了
    {
        Test ret(mValue);
        
        mValue++;
        
        return ret;
    }
};

int main()
{
    Test t(0);
    
    t++;            // 此时t++和下面的++t是不一样的。因为他们重载调用的函数不同
    cout << "t++ = " << t.value() << endl;
    
    ++t;            //
    cout << "++t = " << t.value() << endl;
    
    return 0;
}

技术分享图片

第40课.前置操作符和后置操作符

原文:https://www.cnblogs.com/huangdengtao/p/11916834.html

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