自增減操作符探索

2021-04-08 16:55:39 字數 1974 閱讀 1390

有乙個自定義類

unsignedint

表示無符號型的整數,

unsignedint un1(1);

unsignedint un2(1);

un1 += un2;// un1+un2,

也就是一加一

如果不過載

+=的話將會出錯,那麼要使用在的話該怎麼定義呢

unsignedint& operator += (const unsignedint& other)

其實上面的實際表達的意思就是一加一,其實我們可以這樣寫來實現自增

un1 ++;

或++un1;

那麼讓其自增操作是怎麼定義呢?

前置式:

unsignedint& operator++ ()

後置式:

const unsignedint& operator++ (int)

同樣自減操作符定義如下:

前置式:

unsignedint& operator-- ()

後置式:

const unsignedint& operator-- (int)

你可能會發現乙個問題,相對於

+=運算來說,自增或自減都沒有第二個運算元,實際的表現就是沒有引數,但我們知道過載函式係以其引數型別來區分彼此,也就是說前置或後置是根本無法區分的。為了彌補這個語言上的不足,只好讓後置式有乙個

int型的自變數,並且他被呼叫時,編譯器預設的將該

int指定為0值。

我們再來看一下它的實現:

unsignedint& operator++ ()

const unsignedint& operator++ (int)

是的,正如我們所看到的,引數的唯一目的只是為了區分前置式還是後置式,實際上它並沒有被用到。如果指定了

int的變數的名稱,

比如int n

,那麼編譯器就可能給出警告,這樣的話就讓人感覺不舒服,儘管他是正確的。與其這樣還不如略去實際的變數宣告,直接就寫型別就行了。

你可能會發現前置和後置還有乙個區別:後置式多了乙個

const

修飾符,可這是為什麼呢?考慮如下**:

unsignedint un1(1);

un1++++;

若沒有

const

修飾符un1

的值等於多少?答案是

2。為什麼呢?

un1++++

可以理解為如下的各式:

(un1++) ++

àun1.operator++(0). operator++(0);

由於

un1++

返回的結果是乙個臨時值,在臨時值的基礎上進行的後置操作只是讓臨時值增加1,而

un1被使用了一次而且只增加了

1,這違背了這樣的兩次連續操作要達到

un1加

2的目的。 所以

const

修飾符用於限定進行第二次連續操作的執行,保證**執行邏輯的正確性。因此只要出現連續加的情況,編譯器就會報錯,從編譯期就指出錯誤,而不至於將這樣的錯誤延續到執行期進行人工的排除。

而對於前置式的累加(減)操作則式完全合法的。比如:

++++un1

的結果等於3。

最後**一下效率問題。你認為那個效率更高呢?答案是前置式!可這是為什麼呢?正如我們前面所看的後置式的實現過程那樣,後置式在其實現過程中引入了區域性變數,而區域性的構造和析構都有需要浪費一定的時間成本。所以前置式的效率要高於後置式。

實現**:

class unsignedint

;

unsignedint(int n)

~unsignedint() {};

unsignedint& operator++ ()

const unsignedint& operator++ (int n)

unsignedint& operator = (const unsignedint& other)

};

自增減操作符探索

有乙個自定義類 unsignedint 表示無符號型的整數,unsignedint un1 1 unsignedint un2 1 un1 un2 un1 un2,也就是一加一 如果不過載 的話將會出錯,那麼要使用在的話該怎麼定義呢 unsignedint operator const unsign...

c語言中自增操作符與自減操作符

初學c語言的朋友肯定對自增操作符和自減操作符感到頭疼,一下就討論一下自增操作符,自減操作符。在程式設計中遇到的問題最好就是遍個程式試試。include int main 終端輸出結果是 4 2,那麼可以說明c先自增成2,然後加法操作用的是自增後的值2。include int main 而這個程式只是...

自增 和自減 操作符

自增操作符和自減操作符經常要在我們自定義的類型別中使用到,而使用時經常會出現問題。現把自己在學習的過程中的 拿出來看一下,也是c primer中的例子如下 ifndef check ptr define check ptr include using namespace std class chec...