C++中的鏈式操作

來源:互聯網
上載者:User

標籤:c++   鏈式操作   運算子多載   

代碼編譯環境:Windows7 32bits+VS2012。

1.什麼是鏈式操作

鏈式操作是利用運算子進行的連續運算(操作),它的特點是在一條語句中出現兩個或者兩個以上相同的操作符,如連續的賦值操作、連續的輸入操作、連續的輸出操作、連續的相加操作等都是鏈式操作的例子。

鏈式操一定涉及到結合律的問題,例如鏈式操作賦值操作滿足右結合律,即a=b=c被解釋成a=(b=c),而鏈式輸出操作原則滿足左結合律,即cout<

2.類類型的鏈式操作

為了實作類別類型的鏈式操作,使鏈式操作能夠進行,操作符的重載必須滿足一定的要求:
(1)操作符沖在函數一定不能返回void類型。
因為void類型不能參與任何運算,所以,操作符重載函數返回void類型實際上是阻止了鏈式操作的可能性。

(2)對賦值操作符進行重載,如果返回的是類的對象,那麼鏈式賦值操作必須藉助於拷貝建構函式才能進行。這樣不懂那會有較大的運行開銷,還要編寫正確的拷貝建構函式。考察下面的程式。

#include <iostream>using namespace std;class Complex{    double real;    double image;public:    Complex(double r=0.0,double i=0.0){        real=r;        image=i;    }    Complex(const Complex& c){        cout<<"Copy Constructor"<<endl;        real=c.real;        image=c.image;    }    void Show(){        cout<<real<<"+"<<image<<"i"<<endl;    }    Complex operator=(const Complex&);};Complex Complex::operator=(const Complex& c){    real=c.real;    image=c.image;    return *this;}int main(int argc,char* argv[]){    Complex c1(2.3,4.5),c2,c3;    c1.Show();    c3=c2=c1;    c2.Show();    c3.Show();    getchar();}

程式的運行結果是:

可以看到,在連續的兩次賦值操作過程中,一共兩次調用拷貝建構函式。第一次發生在執行c2=c1的操作中,函數的傳回值(臨時對象)是由c1構造的,這時發生了一次拷貝建構函式的調用;第二次發生在為c3賦值的時候,賦值運算的傳回值仍然是一個Complex類的對象,這時又發生了一次拷貝建構函式的調用。讓賦值操作依賴於拷貝建構函式,顯然不是一種明智的做法。

思考:Complex& Complex::operator=(Complex& c){…},會有什麼結果?

僅僅將賦值運算子多載函數的申明和定義修改如下:

Complex operator=(const Complex&);Complex Complex::operator=(const Complex& c){    real=c.real;    image=c.image;    return *this;}

同樣是上面的程式,輸出結果為:

也就是說,一次拷貝建構函式都沒有調用,原因是複製操作符函數返回的是Complex類的引用,不用產生一個新的臨時對象,這樣大大提高了程式的運行效率。所以,賦值運算子的重載幾乎無一例外地採用了返回引用的方式編寫。

3.實現輸入輸出的鏈式操作

輸入操作符(>>)和輸出操作符(>>)的重載函數必須返回引用,否則鏈式無法操作無法完成。

一般來說,實現輸入操作符重載,一律採用如下函數原型:
istream& operator>>(istream&, className&);

而實現輸出操作符重載,一律採用如下函數原型:
ostream& operator<<(ostream&, className&);

如果操作符函數的返回的是istream或ostream類的對象,而不是引用,會出現編譯錯誤。出錯的原因以及關於輸入輸入操作符的重載,敬請期待我的後續blog。

參考文獻

[1] ]陳剛.C++進階進階教程[M].武漢:武漢大學出版社,2008.

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

C++中的鏈式操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.