国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

對C++遞增(增量)運算符重載的思考

2019-11-17 05:03:41
字體:
來源:轉載
供稿:網(wǎng)友

  在前面的章節(jié)中我們已經(jīng)接觸過遞增運算符的重載,那時候我們并沒有區(qū)分前遞增與后遞增的差別,在通常情況下我們是分別不出++a與a++的差別的,但的確他們直接是存在明顯差別的。

  先看如下代碼:
#include <iostream>   
using namespace std;   
   
int main()   
{   
    int a=0; 
    ++(++a);//正確,(++a)返回的是左值 
    (a++)++;//錯誤,(a++)返回的不是左值 
    system("pause"); 
}   代碼中(a++)++編譯出錯誤,返回“++”需要左值的錯誤,這正是前遞增與后遞增的差別導致的,那么又是為什么呢?

  原因主要是由C++對遞增(增量)運算符的定義引發(fā)的。

他們之間的差別主要為以下兩點:

  1、運算過程中,先將對象進行遞增修改,而后返回該對象(其實就是對象的引用)的叫前遞增(增量)運算。在運算符重載函數(shù)中采用返回對象引用的方式編寫。

  2、運算過程中,先返回原有對象的值,而后進行對象遞增運算的叫后遞增(增量)運算。在運算符重載函數(shù)中采用值返回的方式編寫(這也正是前面(a++)++出錯誤的原因,(a++)返回的不是引用,不能當作左值繼續(xù)參加擴號外部的++運算),重載函數(shù)的內(nèi)部實現(xiàn)必須創(chuàng)建一個用于臨時存儲原有對象值的對象,函數(shù)返回的時候就是返回該臨時對象。  那么在編寫運算符重載函數(shù)的時候我們該如何區(qū)分前遞增運算符重載函數(shù)與后遞增運算符重載函數(shù)呢?

  方法就是:在后遞增運算符重載函數(shù)的參數(shù)中多加如一個int標識,標記為后遞增運算符重載函數(shù)。

  具體見如下實例(例一為非成員方式,例二為成員方式)://例一 
 
//程序作者:管寧         
//站點:www.cndev-lab.com         
//所有稿件均有版權,如要轉載,請務必聞名出處和作者      
   
#include <iostream>   
using namespace std;   
   
class Test     
{     
    public:     
        Test(int a=0) 
        { 
            Test::a = a; 
        } 
    friend Test& Operator ++ (Test&); 
    friend Test operator ++ (Test&,int); 
    public: 
    int a; 
}; 
Test& operator ++ (Test &temp)//前遞增 

    temp.a++; 
    return temp; 

Test operator ++ (Test &temp,int)//后遞增,int在這里只起到區(qū)分作用,事實上并沒有實際作用 


    Test rtemp(temp);//這里會調(diào)用拷貝構造函數(shù)進行對象的復制工作 
    temp.a++; 
    return rtemp; 

int main() 

    Test a(100); 
    ++(++a); 
    cout<<a.a<<endl; 
    cout<<"觀察后遞增情況下臨時存儲對象的值狀態(tài):"<<(a++).a<<endl;//這里正是體現(xiàn)后遞增操作先返回原有對象值地方 
    cout<<a.a<<endl; 
    (a++)++; 
    cout<<a.a<<endl;//由于后遞增是值返回狀態(tài),所以(a++)++只對a做了一次遞增操作,操作后為104而非105。 
    system("pause"); 
} 更多文章 更多內(nèi)容請看C/C++技術專題專題,或 //例二 
 
//程序作者:管寧         
//站點:www.cndev-lab.com         
//所有稿件均有版權,如要轉載,請務必聞名出處和作者      
   
#include <iostream>   
using namespace std;   
   
class Test     
{     
    public:     
        Test(int a=0) 
        { 
            Test::a = a; 
        } 
    Test& operator ++ (); 
    Test operator ++ (int); 
    public: 
    int a; 
}; 
Test& Test::operator ++ ()//前遞增 

    this->a++; 
    return *this; 

Test Test::operator ++ (int)//后遞增 

    Test rtemp(*this);//這里會調(diào)用拷貝構造函數(shù)進行對象的復制工作 
 
    this->a++; 
    return rtemp; 

int main() 

    Test a(100); 
    ++(++a); 

    cout<<a.a<<endl; 
    cout<<"觀察后遞增情況下臨時存儲對象的值狀態(tài):"<<(a++).a<<endl;//這里正是體現(xiàn)后遞增操作先返回原有對象值地方 
    cout<<a.a<<endl; 
    (a++)++; 
    cout<<a.a<<endl;//由于后遞增是值返回狀態(tài),所以(a++)++只對a做了一次遞增操作,操作后為104而非105。 
    system("pause"); 
}  通過對前后遞增運算的分析,我們可以進一步可以了解到,對于相同情況的單目運算符重載我們都必須做好這些區(qū)別工作,保證重載后的運算符符合要求。  更多文章 更多內(nèi)容請看C/C++技術專題專題,或

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东辽县| 河东区| 安庆市| 信宜市| 铜山县| 阿合奇县| 辛集市| 慈溪市| 建瓯市| 开远市| 澎湖县| 玛纳斯县| 乌拉特后旗| 柳州市| 青阳县| 乾安县| 镇安县| 鸡泽县| 锡林郭勒盟| 潜山县| 临澧县| 德格县| 栾城县| 板桥市| 江达县| 屏山县| 高台县| 兴安盟| 台东县| 东平县| 长葛市| 无极县| 新巴尔虎左旗| 揭阳市| 鄂尔多斯市| 勃利县| 云和县| 大悟县| 巴东县| 中牟县| 始兴县|