c++ 前置++與後置++的區別
用C++程式設計的都知道,C++提供了一個非常強大的操作符過載機制,利用操作符過載,我們可以為我們自定義的類增加更多非常有用的功能。不過,C++也有限制,就是當我們為自定義的類過載操作符時,過載操作符的含義應該跟內建型別一樣,比如,你不能通過過載+號操作符來實現兩個數相乘的運算,實現需要是兩個數相加的運算。本篇,我重點介紹下過載前置++和後置++的區別(前置--跟後置--類似)。
我們知道,寫for迴圈年的時候,可以用下面這兩種方式:
for(int i=0; i<10; i++) { //do something } for(int j=0; j<10; ++j) { //do something }
如上兩種方式,i++跟++j到底有什麼區別呢?
首先,這兩種方式都會使得i跟j自增1, 不同的地方在於其內部實現; i++的實現原理是現將i自增1,然後返回i的引用(我們知道過載操作符也是可以有返回值的);而++j的實現原理是:先定義一個j的副本,然後在將j自增1,最後返回之前定義個那個副本的值。
通常,c++的內建型別都要求字首式操作符返回被增量或被減量物件的引用;而要求字尾式操作符返回被增量活被減量物件做增或減操作之前的副本(這裡邊就存在記憶體拷貝)。
實際的呼叫過程看起來應該是這樣:
for( inti=0; i<10; i.operator++(0) ) { //呼叫後置++ //do something } for( int i=0; i<10; i.operator++() ) { //呼叫前置++ //do something }
看到這裡,你可能 有個疑問,為什麼呼叫後置++的之後,引數列表要傳一個0而前置++卻沒有傳呢?
這裡就牽扯出前置++跟後置++的另一個差別。
前置++和後置++在定義的都是一樣,看起來應該是下邊這樣:
class A { private: int a; public: A& operator++() { //... } A operator++() { //... } }
這樣,我們就無法區分到底哪個是哪個了,也許你會說它們的返回值不是不一樣嗎? 我們老早就知道,無法通過不同的返回值來過載不同的函式版本。
這種情況下,為了做區分也是為了解決這一問題,一般要求字尾式操作符接受一個額外的int型形參(不會使用它,僅做區分用),來區別兩者的不同。
class A { private: int a; public: A& operator++() { //前置++ //... } A operator++(int) { //後置++ //... } }
這樣,編譯器將為我們提供0作為這個字尾式版本的形參。(也可以呼叫這個有引數的版本做字首式操作,不過一般不應該這麼做),下邊是完整定義:
class A { private: int a; public: A& operator++() { //前置++ ++a; return *this; } A operator++(int) { //後置++ A a = *this; ++*this; returnn a; } }
如上,操作符的字尾式比字首式複雜一些,在實現字尾式版本時,一般先儲存物件做自增/減之前的副本,然後呼叫自己的字首版本來實現自增操作,最後將先前年保留的副本
返回。這裡需要注意的是,字尾式版本中,返回值是尚未自增的原值,但物件本身已經做了自增操作了。
( ps : --操作符的字首式和字尾式型別)
相關推薦
c++ 前置++與後置++的區別
用C++程式設計的都知道,C++提供了一個非常強大的操作符過載機制,利用操作符過載,我們可以為我們自定義的類增加更多非常有用的功能。不過,C++也有限制,就是當我們為自定義的類過載操作符時,過載操作符的含義應該跟內建型別一樣,比如,你不能通過過載+號操作符來實現兩個數相乘的運算,實現需要是兩個數相加的運算
C++過載++ 如何區分“++”過載的前置與後置
來源:http://blog.csdn.net/hemingliang1987/article/details/9204815 在C++中過載單目運算子時,會出現前置還是後置的問題,如++,–等 例如 i++與 ++i 這個時候如何讓編譯器知道是前置還是後置呢? 其實很簡單,只要在過載操作符的引數中加上
C/C++中自增自減的前置和後置區別
自增自減操作符在程式設計中很常用,都分為分為前置和後置兩種操作符,對於兩者的區別,C++ primer中有著如下說明: 1. 前置操作返回的結果為左值,後置操作返回的是右值,也就是說執行如下的程式碼都會編譯不通過: int i = 0, j
C語言中前置++和後置++的區別
直接上程式碼 #include <stdio.h> int main(int argc, char* argv[]) { int a = 6; printf("%d\n",a++); //輸出為6,返回的是暫存器的值,而不是加後的
C++中的前置和後置++
增量 後置 內置 因此 效率 要求 來講 註意 對象 在C++中進行操作符重載的時候,前置++返回的是一個引用。 這就設計到了對於基本變量進行前置操作時候的理解了。 例如,對於int類型變量,在進行前置++的時候,是會將i進行加1,然後返回i的引用。而i++是先創建一個i的
js一元操作符之遞增遞減操作符的前置型與後置型詳解
javascrip中,一元操作符中 遞增操作符: ++ 遞減操作符: -- 這兩個操作符可以放在變數的前面,也可以放在變數的後面。但是前後是有區別的。 1. a++與++a都是對a進行自加1,結果完全相同;遞減操作符都是自減1。
C++ 變數“前++”與“後++”的區別
問題描述 我們在使用迴圈遍歷容器時,經常會看到一個自增/自減的表示式,比如:i++、++i、--i、++i。我們在書本上比較常見的就是++i,那麼到底 i++ 與 ++i有什麼區別呢? 區別1 書本上解釋的表示式方式區別:i++是先取變數i,再將變數i值+1;而++i是先將變數i值+
C++回顧之前置++、後置++、不等號!及賦值運算子過載
運算子過載的主要目的是為了讓類物件能像普通資料型別一樣能夠進行加減乘除,自加自減等操作,非常直觀方便。現在來回顧C++的自加減(分前置與後置)以及不等號非運算子,賦值運算子的過載。 1 ++過載 (1)前置++運算子的過載方式
C# dynamic與var的區別
.html class url epo html mic http var single 1.C#編程總結(十四)dynamic 2.var和dynamic的區別及如何正確使用dynamic? C# dynamic與var的區別
C# HashTable與Dictionary的區別
字符串 同時 找到 lis mov ble logs 去除 lba HashTable和Dictionary的區別 1.HashTable 哈希表(HashTable)表示鍵/值對的集合。在.NET Framework中,Hashtable是System.Coll
c# as與is的區別
ace -c bject clr 類型 back 常用 luci 再次 在c#語言中關於類型的判斷與轉換有is和as這2種操作符,具體用法如下: is檢查一個對象是否兼任與指定的類型,並返回一個Boolean值:true或false,主要,is操作符永遠不會拋出
C# out與ref的區別
out 關鍵字會導致引數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變數必須在傳遞之前進行初始化。若要使用 out 引數,方法定義和呼叫方法都必須顯式使用 out 關鍵字。例如: class OutExample { &nbs
C# Convert 與 Parse 的區別
一、Convert.ToDouble與Double.Parse的區別 Convert.ToDouble 內部呼叫了 Double.Parse (1)對於引數為null的時候: Convert.ToDouble 引數為 null 時,返回 0.0; Double.Parse 引數為 null 時,丟擲異
Java學習筆記:C/S 與B/S 區別!
C/S 是Client/Server 的縮寫,是客戶機與伺服器結構的應用程式;B/S是Brower/Server 的縮寫,是瀏覽器和伺服器結構的應用程式,即Web 應用程式。C/S 與B/S 區別如下: 1)硬體環境不同: C/S 一般建立在專用的網路上, 小範圍裡的網路環境, 區域網
#Java學習筆記:C/S 與B/S 區別!
C/S 是Client/Server 的縮寫,是客戶機與伺服器結構的應用程式;B/S是Brower/Server 的縮寫,是瀏覽器和伺服器結構的應用程式,即Web 應用程式。C/S 與B/S 區別如下: 如果有想要學習java的小夥伴,可來我們的java學習扣裙
ERP之軟體系統架構- C/S與B/S區別與簡介TEL:13083567937
一、什麼是C/S和B/S 要想對“C/S”和“B/S”技術發展變化有所瞭解,首先必須搞清楚三個問題。 第一、什麼是C/S結構。 C/S(Client/Server)結構,即大家熟知的客戶機和伺服器結構。它是軟體系統 體系結構,通過它可以充分利用兩端硬體環境的優勢
c++引用與指標的區別
★ 相同點: 1. 都是地址的概念; 指標指向一塊記憶體,它的內容是所指記憶體的地址;引用是某塊記憶體的別名。 ★ 區別: 1. 指標是一個實體,而引用僅是個別名; 2. 引用使用時無需解引用(*),指標需要解引用;
Spring AOP如何用註解實現前置、後置、返回後通知
首先新建一個Java Project工程,導包、建Package包,建立三個類分別為學生Student、教師Teacher、測試Test類。再建立一個bean.xml的配置檔案。在學生類Student中建立兩個分別為String型別和Integer型別的屬性na
關於c++陣列與vector的區別
emm,第一次寫部落格有點緊張。 今天刷藍橋杯碰到一個小問題,有一個測試點總是過不去,後來把程式碼裡的陣列換成vector向量後就解決了。題目是這樣的: 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數n,表示序列長
c#類與結構體區別
終於寫到這裡了!下面就是我們大家期待已久的內容了!結構體與類的區別;希望通過我下面的講解,對大家能夠有所幫助,同時文章中有不足之處,大家多多指出哦!感激不盡!!! 這篇主要以程式碼和簡單文字說明來闡述它們的異同之處。 1.關鍵字不同 定義類使用關鍵字cl