鏈式操作

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

基本介紹

  • 中文名:鏈式操作
  • 外文名:chain operation
1.鏈式操作的結合律
鏈式操作一定涉及到結合律的問題,例如C++中的鏈式操作賦值操作滿足右結合律,即a=b=c被解釋成a=(b=c),而鏈式輸出操作原則滿足左結合律,即cout<<a<<b被解釋成(cout<<a)<<b,基本數據類型的鏈式操作都有明確的定義,而涉及到類類型的鏈式操作則往往需要進行操作符的重載。
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類的對象,而不是引用,會出現編譯錯誤。

相關詞條

熱門詞條

聯絡我們