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

2021-10-24 09:24:27 字數 2876 閱讀 9071

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:9.2.0

一、值得思考的問題

1)下面的**有沒有區別?為什麼?

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

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

test.cpp

#include using namespace std;

int main()

操作:

1) g++ test.cpp -o test.out編譯錯誤:

test.cpp:13:6: error: lvalue required as left operand of assignment

i++ += 1

錯誤:左值所需的左運算元被賦值(i++是數值,數值不能給數值賦值)

答:

1)對於基礎型別的變數

-    前置++的效率與後置++的效率基本相同

-    根據專案組編碼規範進行選擇

2)對於類型別的物件

-    前置++的效率高於後置++

-    盡量使用前置++操作符提高程式效率

程式設計實驗

真的有區別嗎?

40-1.cpp

#include #include using namespace std;

int main()

vs2013/g++

++i和i++作為單獨一行**時效果一樣

檢視彙編**一致

二、意想不到的事實

1)現代編譯器產品會對**進行優化

2)優化使得最終的二進位制程式更加高效

3)優化後的二進位制程式丟失了c/c++的原生語義

4)不可能從編譯後的二進位制程式還原c/c++程式

三、思考

++操作符可以過載嗎?如何區分前置++和後置++?

四、++操作符過載(--操作符自己來)

1)++操作符可以被過載

-    全域性函式和成員函式均可進行過載

-    過載前置++操作符不需要額外的引數

-    過載後置++操作符需要乙個int型別的佔位引數

程式設計實驗

++操作符的過載

40-2.cpp

#include #include using namespace std;

class test

int value()

//返回返回值為引用,表示返回物件本身

test& operator ++ () //前置++

//函式返回值為數值(臨時物件)

test operator ++ (int) //後置++,編譯器提示,需要佔位引數int

};int main()

操作:

1) g++ 40-2.cpp -o 40-2.out編譯正常:

分析:後置++效率低,因為它需要在棧上建立臨時物件,出棧時還需要銷毀物件;前置++沒有這種複雜操作。

注意:過載的前置++操作符函式返回值為引用型別,因為原生語義中前置++先執行的是變數本身,最後才執行++操作。這裡使用引用是為了返回變數本身,而不是數值。

五、真正的區別

1)對於基礎型別的變數

-    前置++的效率與後置++的效率基本相同

-    根據專案組編碼規範進行選擇

2)對於類型別的物件

-    前置++的效率高於後置++

-    盡量使用前置++操作符提高程式效率

程式設計實驗

複數類的進一步完善

complex.h

#ifndef _complex_h_

#define _complex_h_

class complex

;#endif

complex.cpp

#include "complex.h"

#include "math.h"

complex::complex(double a, double b)

double complex::geta()

double complex::getb()

double complex::getmodulus()

complex complex::operator + (const complex& c)

complex complex::operator - (const complex& c)

complex complex::operator * (const complex& c)

complex complex::operator / (const complex& c)

bool complex::operator == (const complex& c)

bool complex::operator != (const complex& c)

complex& complex::operator = (const complex& c)

return *this;

}complex& complex::operator ++ () //前置++

complex complex::operator ++ (int) //後置++

小結

1)編譯優化使得最終的可執行程式更加高效

2)前置++操作符和後置++操作符都可以被過載

3)++操作符的過載必須符合其原生語義

4)對於基礎型別,前置++與後置++的效率幾乎相同

5)對於類型別,前置++的效率高於後置++

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

下面的 有區別嗎?進入彙編 i i 的值作為返回值,i自增1 i i自增1,i的值作為返回值 include include using namespace std int main int value test operator 過載前置 操作符 test operator int 過載後置 操作...

前置操作符和後置操作符

操作符可以被過載 全域性函式和成員函式均可以進行過載 過載前置 操作符不需要額外的引數 過載後置 操作符需要乙個int型別的佔位引數 來看乙個例子 include include using namespace std class test intvalue test operator test o...

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

void code include using namespace std int main vc 2010 彙編 int i 0 0127136e mov dword ptr i 0 i 01271375 mov eax,dword ptr i 01271378 add eax,1 0127137...