亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++中的運算符重載函數基礎及其值返回狀態

2019-11-17 05:26:14
字體:
來源:轉載
供稿:網友

  運算符重載是C++的重要組成部分,它可以讓程序更加的簡單易懂,簡單的運算符使用可以使復雜函數的理解更直觀。

  對于普通對象來說我們很自然的會頻繁使用算數運算符讓他們參與計算,但是對于自定義類的對象來說,我們是無論如何也不能阻止寫出像下面的代碼一樣的程序來的。

例子如下:

 C++ 代碼 class Test 

    //過程省略 

 
int main() 

    Test a,c; 
    c=a+a; 
}


  當然這樣的代碼是不能夠通過編譯的,c++對自定類的算術運算部分保留給了程序員,這也是符合c++靈活特性的。
  在c++中要想實現這樣的運算就必須自定義運算符重載函數,讓它來完整具體工作。
  在這里要提醒讀者的是,自定義類的運算符重載函數也是函數,你重載的一切運算符不會因為是你自己定義的就改變其運算的優先級,自定義運算符的運算優先級同樣遵循與內部運算符一樣的順序。
  除此之外,c++也規定了一些運算符不能夠自定義重載,例如.、::等等。 三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案 C++中的運算符重載函數基礎及其值返回狀態

  上表是在C++中答應重載的運算符總表

  下面我們來學習如何重載運算符,運算符重載函數的形式是:

返回類型 Operator 運算符符號 (參數說明)
{
//函數體的內部實現
}

  運算符重載函數的使用主要分為兩種形式,一種是作為類的友元函數進行使用,另一種則是作為類的成員函數進行使用。

下面我們先看一下作為類的友元函數使用的例子:

 C++ 代碼  
//程序作者:管寧     
//站點:www.cndev-lab.com     
//所有稿件均有版權,如要轉載,請務必聞名出處和作者    
 
#include <iostream> 
using namespace std; 
 
class Test 

    public: 
        Test(int a = 0) 
        { 
            Test::a = a; 
        } 
        friend Test operator +(Test&,Test&); 
        friend Test& operator ++(Test&); 
    public: 
        int a; 
}; 
Test operator +(Test& temp1,Test& temp2)//+運算符重載函數 

    //cout<<temp1.a<<""<<temp2.a<<endl;//在這里可以觀察傳遞過來的引用對象的成員分量 
    Test result(temp1.a+temp2.a); 
    return result; 

Test& operator ++(Test& temp)//++運算符重載函數 

    temp.a++; 
    return temp; 

int main() 

    Test a(100); 
    Test c=a+a; 
    cout<<c.a<<endl; 
    c++; 
    cout<<c.a<<endl; 
    system("pause"); 
}


  在例子中,我們對于自定義類Test來說,重載了加運算符與自動遞增運算符,重載的運算符完成了同類型對象的加運算和遞增運算過程。

  重載運算符函數返回類型和形式參數也是根據需要量進行調整的,下面我們來看一下修改后的加運算符重載函數。

代碼如下:


 C++ 代碼  
//程序作者:管寧     
//站點:www.cndev-lab.com     
//所有稿件均有版權,如要轉載,請務必聞名出處和作者    
 
#include <iostream> 
using namespace std; 
 
class Test 

    public: 
        Test(int a = 0) 
        { 
            Test::a = a; 
        } 
        friend Test operator +(Test&,const int&); 
    public: 
        int a; 
}; 
Test operator +(Test& temp1,const int& temp2)//+運算符重載函數 

    Test result(temp1.a * temp2); 
    return result; 

int main() 

    Test a(100); 
    Test c = a + 10; 
    cout<<c.a<<endl; 
    system("pause"); 
}


  上面修改后的例子中,我們讓重載后的加運算符做的事情,事實上并不是同類型對象的加運算,而是自定義類對象與內置int常量對象的乘法運算。

  值得注重的是,對于運算符重載來說,我們并不一定要用它一定要做同類型對象的加法或者是其它運算,運算符重載函數本身就是函數,那么在函數體內部我們是可以做任何事情的,但是從不違反常規思維的角度來說,我們沒有必要讓重載加運算的函數來做與其重載的符號意義上完全不相符的工作,所以在使用重載運算符脫離原意之前,必須保證有足夠的理由。
  下面我們討論一下作為類成員函數的運算符重載函數的使用,及其函數的值返回與引用返回的差別。

  下面我們先看實例,而后逐步分析。

代碼如下(重要部分做了具體的注解):

 C++ 代碼  
//程序作者:管寧     
//站點:www.cndev-lab.com     
//所有稿件均有版權,如要轉載,請務必聞名出處和作者    
 
#include <iostream> 
using namespace std; 
 
class Test 

    public: 
        Test(int a = 0) 
        { 
            Test::a = a; 
        } 
        Test(Test &temp) 
        //運算符重載函數為值返回的時候會產生臨時變量,臨時變量與局部變量result的復制會調用拷貝構造函數,臨時變量的生命周期是在拷貝構造函數運行完成后才結束,但假如運算符重載函數返回的是引用,那么不會產生臨時變量,而局部變量result的生命周期在運算符重載函數退出后立即消失,它的生命周期要比臨時變量短,所以當外部對象獲取返回值的內存地址所存儲的值的時候,獲得是一個已經失去效果的內存地址中的值,在這里的值返回與引用返回的對比,證實了臨時變量的生命周期比局部變量的生命周期稍長。 
        { 
            cout<<"載入拷貝構造函數"<<""<<temp.a<<endl;//注重這里,假如修改運算符重載函數為返回引用,這里就會出現異常,temp.a將獲得一個隨機值。 
            Test::a = temp.a; 
        } 
        ~Test()//在mian()內析構的過程是result局部變量產生的 
        { 
            cout<<"載入析構函數!"<<endl; 
            cin.get(); 
        } 
        Test operator +(Test& temp2)//+運算符重載函數 
        { 
            //cout<<this->a<<endl; 
            Test result(this->a+temp2.a); 
            return result; 
        } 
        Test& operator ++()//++運算符重載函數 
 
        //遞增運算符是單目運算符,使用返回引用的運算符重載函數道理就在于它需要改變自身。 
        //在前面我們學習引用的單元中我們知道,返回引用的函數是可以作為左值參與運算的,這一點也符合單目運算符的特點。 
        //假如把++運算符重載函數改成值返回的話,程序中的++(++c)運算結束后輸出c.a,會發現對象c只做了一次遞增運算,原因在于,當函數是值返回狀態的時候括號內的++c返回的不是c本身而是臨時變量,用臨時變量參與括號外的++運算,當然c的值也就只改變了一次。 
        { 
            this->a++; 
            return *this; 
        } 
    public: 
        int a; 
}; 
 
int main() 

    Test a(100); 
    Test c=a+a; 
    cout<<c.a<<endl; 
    c++; 
    cout<<c.a<<endl; 
    ++c; 
    cout<<c.a<<endl; 
    ++(++c); 
    cout<<c.a<<endl; 
    system("pause"); 
}

三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案
  上例中運算符重載函數以類的成員函數方式出現,細心的讀者會發現加運算和遞增運算重載函數少了一個參數,這是為什么呢?
  因為當運算符重載函數以類成員函數身份出現的時候,C++會隱藏第一個參數,轉而取代的是一個this指針。

  接下來我們具體分析一下運算符重載函數的值返回與引用返回的差別。

  當我們把代碼中的加運算重載函數修改成返回引用的時候:

 C++ 代碼         Test& operator +(Test& temp2)//+運算符重載函數   
        { 
            Test result(this->a+temp2.a);   
            return result;   
        }


  執行運算符重載函數返回引用將不產生臨時變量,外部的Test c=a+a; 將獲得一個局部的,棧空間內存地址位置上的值,而??臻g的特性告訴我們,當函數退出的時候函數體中局部對象的生命周期隨之結束,所以保存在該地址中的數據也將消失,當c對象去獲取存儲在這個地址中的值的時候,里面的數據已經不存在,導致c獲得的是一個隨機值,所以作為雙目運算的加運算符重載函數是不益采用返回引用方式編寫的,當然假如一定要返回引用,我們可以在堆內存中動態開辟空間存儲數據,但是這么做會導致額外的系統開銷,同時也會讓程序更難讀懂。


  對于遞增運算符來說,它的意義在于能夠改變自身,返回引用的函數是可以作為左值參與運算的,所以作為單目運算符,重載它的函數采用返回引用的方式編寫是最合適的。

  假如我們修改遞增運算符重載函數為值返回狀態的時候,又會出現什么希奇的現象呢?

代碼如下:

 C++ 代碼         Test operator ++() 
        { 
            return this->a++; 
        }


  表面上是發現不出什么非凡明顯的問題的,但是在main()函數中++(++c);的執行結果卻出乎意料,理論上應該是204的值,卻只是203,這是為什么呢?
  因為當函數是值返回狀態的時候括號內的++c返回的不是c本身而是臨時變量,用臨時變量參與括號外的++運算,當然c的值也就只改變了一次。結果為203而不是204。


  對于運算符重載函數來說,最后我們還要注重一個問題,當運算符重載函數的形式參數類型全部為內部類型的時候,將不能重載。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产欧美精品一区二区三区| 成人黄色免费片| 欧美激情国产日韩精品一区18| 亚洲自拍偷拍网址| 欧美午夜视频一区二区| 国产精品久久久久久一区二区| 日韩成人av在线播放| 日韩精品在线电影| 国产一区二区成人| 国产91精品黑色丝袜高跟鞋| 国产精品99蜜臀久久不卡二区| 久久久久久久久久久人体| 亚洲一区二区三区乱码aⅴ| 国产欧美一区二区三区久久| 欧美性高潮床叫视频| 欧美高跟鞋交xxxxxhd| 欧美日韩国产丝袜另类| 欧美性猛交xxxx黑人| 欧美日韩第一视频| 午夜精品一区二区三区在线| 色噜噜狠狠色综合网图区| 成人久久久久久久| 欧美性猛交xxxx免费看| 国产一区二区色| 日韩精品中文字幕有码专区| 国产精品久久久久久久电影| 欧美大胆在线视频| 亚洲人午夜精品| 成人免费视频网址| 国产亚洲精品高潮| 亚洲欧美国产高清va在线播| 国产一区二区三区在线| 久久激情视频免费观看| 国产mv免费观看入口亚洲| 91情侣偷在线精品国产| 国产精品免费久久久久影院| 美女国内精品自产拍在线播放| 欧美精品手机在线| 秋霞成人午夜鲁丝一区二区三区| 欧美激情视频给我| 日韩中文字幕精品视频| 久久久亚洲天堂| 日韩欧美一区二区三区久久| 欧美在线视频一区| 国内精品一区二区三区| 国产69久久精品成人看| 日韩成人性视频| 久久久久一本一区二区青青蜜月| 日日狠狠久久偷偷四色综合免费| 日韩不卡中文字幕| 欧美专区在线视频| 成人免费视频网址| 91久热免费在线视频| 久久精品电影网| 欧美性xxxx极品hd欧美风情| 国产视频精品一区二区三区| 日韩在线高清视频| 国产精品久久久久久久久久久久| 欧美日韩国产丝袜另类| 欧美理论电影在线观看| 久久精品99久久久香蕉| 97超级碰在线看视频免费在线看| 国产一区二区黑人欧美xxxx| 国产做受69高潮| 日本不卡免费高清视频| 国产香蕉一区二区三区在线视频| 91国产美女在线观看| 国产一区二区三区在线免费观看| 亚洲国产一区二区三区四区| 少妇高潮 亚洲精品| 97国产精品视频人人做人人爱| 国产欧美精品一区二区三区介绍| 美女性感视频久久久| 91日本视频在线| 91精品国产亚洲| 精品国产一区二区三区久久狼黑人| 黑人精品xxx一区| 亚洲成色777777女色窝| 亚洲福利在线播放| 亚洲黄色有码视频| 国产美女高潮久久白浆| 538国产精品一区二区免费视频| 成人激情视频在线| 欧美午夜xxx| 久久久亚洲网站| 国产成人免费av电影| 欧美高清视频在线| 国产一区玩具在线观看| 亚洲xxxx视频| 国产精品男女猛烈高潮激情| 国产精品成人免费电影| 成人美女免费网站视频| 深夜福利一区二区| 欧美激情日韩图片| 欧美日韩一区二区三区在线免费观看| 热99精品里视频精品| 国产精品久久久久久五月尺| 日韩激情视频在线| 91精品国产91久久久久久最新| 欧美华人在线视频| 8050国产精品久久久久久| 国产精品一二区| 日韩第一页在线| 91精品国产91久久久久久吃药| 精品国产91久久久久久老师| 不卡av在线播放| 欧美午夜精品伦理| 在线视频免费一区二区| 国产中文字幕日韩| 亚洲午夜性刺激影院| 久久久精品在线观看| 亚洲视频精品在线| 日韩在线不卡视频| 亚洲精品资源在线| 亚洲春色另类小说| 亚洲精品久久久久久久久久久久久| 国产精品黄页免费高清在线观看| 国产999精品| 亚洲欧美变态国产另类| 欧美电影在线观看高清| 日韩在线免费高清视频| 97久久精品国产| 亚洲人成电影在线观看天堂色| 亚洲国产成人精品久久久国产成人一区| 中文字幕精品影院| 国产精品观看在线亚洲人成网| 欧美精品成人91久久久久久久| 亚洲欧美一区二区三区久久| 国产精品av在线| 91九色国产社区在线观看| 亚洲精品www久久久| 日韩亚洲第一页| 亚洲欧美激情视频| 日韩视频在线一区| 2020欧美日韩在线视频| 亚洲电影中文字幕| 亚洲老司机av| 中文字幕最新精品| 成人在线播放av| 亚洲国产中文字幕久久网| 国产精品久久久久久久久久东京| 亚洲视频电影图片偷拍一区| 蜜月aⅴ免费一区二区三区| xxxx欧美18另类的高清| 亚洲精品国产精品国自产在线| 97国产在线观看| 91高清视频免费| 亚洲乱亚洲乱妇无码| 久久久久五月天| 国产欧美日韩综合精品| 精品一区二区三区电影| 日韩av在线网页| 久热爱精品视频线路一| 伊人亚洲福利一区二区三区| 国产精品极品在线| 欧美一区在线直播| 国产精品国产三级国产aⅴ浪潮| 上原亚衣av一区二区三区| 免费不卡欧美自拍视频| 国产精品88a∨| 国产亚洲精品久久久久久777| 欧美久久久精品| 欧美理论电影在线观看| 欧美日韩中文字幕综合视频|