C++學習之前自加和后自加(++i 和 i++)及其深入的理解


今天在我更加深入地學習C++類的重載這一章,特別是讀到有關重載自加運算符(++)的時候,我才發現我對C++的自增自減運算的了解並不很全面。以前只是機械的了解到所謂的前自加(++i)就是先加后用,后自加就是先用后加。這樣就出現了很多我完全解釋不通的地方,如下面的代碼:

int main(){
    int i = 0;
    (i++) = 5; // 這里編譯不通過: error: lvalue required as left operand of assignment
    cout << i << endl;
    i = 0;
    (++i) = 5;//而這里卻可以編譯通過,程序結果輸出5。
    cout << i << endl;
    return 0;
}

為什么前自加可以作為左值,而后自加卻不行?自從學習C++運算符重載這一章以后,我才對這個問題有了新的收獲。在C++大學教程關於運算符重載這一章,我看到他是這樣重載前自加和后自加的:

//以下代碼是從C++大學教程第7版第11章運算符重載第13節研究實例:Data類中摘錄的部分代碼

Data& Data::operator++(){//重載前自加 helpIncremenet();//具體的自加操作,不是重點 return *this;//返回調用對象的引用 } const Data Data::operator++(int){//重載后自加運算 Data temp = *this;//保存調用對象 helpIncrement();//// return temp;//返回臨時對象 }

從上面的代碼可以看出,所謂前自加返回的進行自加運算后的對象引用,而后自加則返回的是執行自加運算前對象的一個臨時變量。雖然一個是自定義的類類型,一個是C++內置類型,但是道理都是相通的。因此現在可以解釋上面代碼的問題了:(++i)運算完成后返回的是對 i加一后的引用,而(i++)運算完成后返回的卻是一個臨時變量並且該變量保存了i未進行加一前的數據。

讀書還是不能不求甚解啊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM