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

前置操作符: ++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;
}

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