C 深度解析 28 過載前置 與後置

2021-10-02 16:17:46 字數 2429 閱讀 2407

3 小結

對於 i++ 和 ++i 有什麼區別呢?區別如下:

我們反彙編一下看看二者的區別到底在哪?

程式設計實驗:原生前置++與後置++的區別

#include

using

namespace std;

intmain()

反彙編如下,我們可以看到對於單純的 i++ 和 ++ i 來說從彙編**上看沒有任何區別。

為什麼單純的 i++ 和 ++i 是一樣的呢?

++ 操作符可以被過載

// 28-2.cpp

#include

using

namespace std;

class

test

intvalue()

test&

operator++(

) test operator++(

int)

// 後置++需要int 型別的佔位引數

private

:int mvalue;};

intmain()

前置 ++ 操作不需要 int 型別的佔位引數,後置 ++ 引數需要乙個 int 型別的佔位引數。前置 ++ 操作直接操作當前物件,返回當前物件,後置 ++ 操作先用當前物件初始化臨時物件,完成對當前物件的操作後返回臨時物件。

編譯執行:

$ g++ 28-2.cpp -o 28-2

$ ./28-2

10

前置 ++ 操作沒有臨時物件,效率較高。後置 ++ 操作生成臨時物件,需要棧空間儲存臨時變數,同時需要呼叫建構函式建立物件,呼叫析構函式銷毀物件,效率較低。

對於基礎型別的變數

// complex.h

#ifndef _complex_h_

#define _complex_h_

class

complex

;#endif

// complex.cpp

#include

"complex.h"

#include

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)

// 28-3.cpp

#include

#include

"complex.h"

using

namespace std;

intmain()

在複數類中過載 ++ 操作符,實現前置 ++ 與後置 ++

$ g++ 28-3.cpp complex.cpp -o 28-3

$ ./28-3

(2,3)

(1,2)

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

2、前置 ++ 和後置 ++ 操作符可以過載

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

4、對於基礎型別,前置 ++ 和後置 ++ 效率幾乎相同,對於類型別,前置 ++ 效率高於後置 ++

C 學習28 過載》和 (輸入輸出運算子)

在c 中,系統已經對左移運算子 和右移運算子 分別進行了過載,使其能夠用於輸入輸出,但是輸入輸出的處理物件只能是系統內建的資料型別。系統過載這兩個運算子是以系統類成員函式的形式進行的,因此cout var語句可以理解為 cout.operator var 如果我們自己定義了一種新的資料型別,需要用輸...

C 14 過載操作符與轉換

cat.h pragma once include include using std string using std ostream using std istream class cat cat string name name name 過載輸入 輸出操作符 若供外部使用,寫非成員函式的樣子...

C 與C 對比學習 函式 四 過載函式匹配

我們知道過載函式中可以形參個數相同,但型別不同.而c 中雙允許做比較靈活的隱式型別轉換.所以呼叫函式時怎麼精確的匹配到要想的函式就是乙個問題.此時一般分三個步驟去匹配 1 先把所有過載函式找出來.把形參個數相同的先選出來.形參個數不同的就直接剔除掉.這相當於是海選,比如人家美女找老公,先看第一感覺,...