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 先把所有過載函式找出來.把形參個數相同的先選出來.形參個數不同的就直接剔除掉.這相當於是海選,比如人家美女找老公,先看第一感覺,...