有乙個自定義類
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...