過載 前置++與後置++
不同於普通的雙目運算子「+/-」,自增自減運算子「++/–」在過載的時候需要額外留意區分是前置式還是後置式。現行的處理方法是,(作為成員函式的)前置「++」不接受任何引數,而後置「++」接受乙個int型別的引數,儘管沒什麼實際用途,但是卻為編譯器確定過載物件提供了幫助。
除了區分的時候需要注意,他們的行為也是有所區別的。援引more effective c++中的話,前置++是increment and fetch,而後置++則是fetch and increment。所以我們在過載這些運算子時也要符合這些要求。
還有一點,則是需要特殊小心地處理返回值問題。前置++通常情況應該返回物件的引用,而後置式的++應該返回乙個const修飾的物件實體。
前置++返回引用的理由很簡單,比如對前置++擁有如下行為:
++(++a)
首先需要明確的是,運算子實際上也是乙個函式呼叫,也是具有返回值的。那麼第二次++是對第一次++的返回值進行操作。如果我們不返回乙個引用而返回乙個新建的臨時物件,那麼第二次++得到的便是對這個臨時物件再進行自增操作的結果,從而導致這條語句對實際的物件a,只能夠進行一次自增操作。可以檢視其反彙編**,能夠證實這一點。而後置的++返回乙個物件實體,則也很簡單,因為你在後置++中,需要臨時儲存舊的值,而這個舊的值必須是後置++的函式體內部的臨時變數。返回乙個臨時變數的指標或者引用是危險的、不允許的。至於為什麼需要const修飾,則是要保證a++++這類表示式在編譯時期非法而不是到執行時期出現不期望的結果。為什麼不能出現a++++,一是內建的資料型別(比如int)不允許我們這樣做;二是就算自定義的類能夠實現這種行為,它也是不符合你的一般常識性想法的:我們通常認為兩個++並在一起會導致a連續遞增兩次,而正如上面分析前置++連用,返回物件而不是引用,則讓第二次的操作物件為乙個臨時物件而不是其本身,與我們預期不一致。為了避免這種誤會,必須要用const修飾符來顯式禁止。函式返回const物件能夠確保不作用在非const的成員函式上,而operator++確實是非const成員函式。
另外,建議在過載後置++時使用++(this),而前置++使用this += 1。因為支援自增運算的物件必然支援加法運算,這樣能夠顯著提高**的簡潔性和可讀性。編譯器的內聯函式優化也並不會增加多少執行速度上的額外開銷(相比於在++內部直接寫函式體)。
這樣我們就得出了通用的、過載++操作符的範例**了:
//prefix ++ : increment and fetch
myclass & myclass::operator++()
//postfix ++ : fetch and increment
const myclass myclass::operator++(int)
關於效率上,通常有「前置式自增」效率較佳,因為前置運算子不需要產生臨時物件和對臨時物件進行建構函式和析構函式的呼叫。如果這個物件比較大,記憶體複製的時間也是較大的。因此,如果不是特殊需要,一般盡可能使用前置++於類型別。這也是似乎在運用stl迭代器時,盡可能在迴圈使用前置++的原因。
**:
前置 和後置 過載
1 前置 過載時沒有引數 而後置 過載時有引數。不會使用其引數,僅僅是區分用。可以理解為前置 後面有引數了,所以不需要引數 i 對應 operator i 對應 operator int 2 前置 需要返回引用 因為過載自加運算子後可以返回物件的引用,以方便在表示式中連續使用。而後置 返回的不是引用...
前置遞加與後置遞加
偶然在網上看到一道題,但是好像回答者並沒有講明白,研究一下好像是這麼個原理,順便記錄下來 1 include 2 using namespace std 3int main 12 p1一開始是指向str1的第乙個字母 a 的,經過 while p1 之後,p1是指向了第5個 注意不是第4個 字元 0...
前置及後置
關於前置及後置 a temp a,a 1,temp 由此看出後置 產生臨時變數 a a 1,a 所以在程式中出現a 10,a a 等試圖改變後置 的值,是錯誤 編譯錯誤 的 前置及後置 的用法 1.遇到逗號結束 如 int a 10 int c a a,a printf d n c 在vc6 中列印...