40-前置操作符和後置操作符

40-前置操作符和後置操作符

值得思考的問題

下面的代碼有沒有區別?爲什麼?

i++;    // i的值作爲返回值,i自增1
++i;    // i自增1,i的值作爲返回值

【範例代碼】真的有區別嗎?

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char* argv[]) {
    int i = 0;

    i++;

    ++i;

    return 0;
}

意想不到的事實

  • 現代編譯器產品會對代碼進行優化
  • 優化使得最終的二進制程序更加高效
  • 優化後的二進制程序丟失了C/C++的原生語義
  • 不可能從編譯後的二進制程序還原C/C++程序

【注意】C/C++開發的軟件無法完全反編譯。

【問題】++操作符可以重載嗎?如何區分前置++和後置++?

++操作符重載

++操作符可以被重載(--操作符一樣):

  • 全局函數和成員函數均可進行重載
  • 重載前置++操作符不需要額外的參數
  • 重載後置++操作符需要一個int類型的佔位參數

【範例代碼】++操作符的重載

#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(int argc, const char* argv[]) {
    Test t(0);

    t++;

    ++t;

    return 0;
}

真正的區別

對於基礎類型的變量:

  • 前置++的效率與後置++的效率基本相同
  • 根據項目編碼規範進行選擇

對於類類型的對象:

  • 前置++的效率高於後置++
  • 儘量使用前置++操作符提高程序效率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章