2012-02-19 67 views
2

我的意思是,我試圖使用操作符重載< <類重載運算符<<在類內工作嗎?

這樣

class A { 
     public: 
      ostream &operator<<(ostream &os);// which doesnt work 

     private: 
      friend ostream &operator<<(ostream &os, const A& a); //Works 
      int i; 

}; 

    Definition 
      ostream &operator<<(ostream &os, const A& a) { 
       os<<a.i; 
       return os; 
      } 

爲什麼我不能重載運算符的類中特定類裏面?或者我錯過了什麼?還是我很愚蠢,甚至想這樣?請指教。

+2

[運算符重載](http://stackoverflow.com/questions/4421706/operator-overloading)的可能重複(請特別看[此答案](http://stackoverflow.com/a/4421719/103167)) – 2012-02-19 17:06:16

回答

12

成員函數:

ostream &operator<<(ostream &os); 

確實的工作,而不是你想要的情況。當你做這樣的事情時,它會被調用:

A a; 
a << std::cout; 

即,其中對象是操作符的左側。

15

問題是,您的operator<<會將ostream作爲第二個參數,而不是第一個參數。這樣,你可以做myObject << std::cout,但它看起來不直觀,並且由於operator<<是左關聯的,你將無法連接呼叫。

將運算符聲明爲朋友而非成員函數的另一個好處是可以進行自動轉換。這意味着如果您的類B不是從A派生的,但確實有B(A const&)構造函數,那麼仍然可以執行std::cout << my_b;並將其轉換爲A,然後進行打印。

幸運的是,如果您願意,可以在班級內定義operator<<作爲朋友。您的代碼可以寫成

class A { 
    int i; 
    friend std::ostream& operator<<(std::ostream& o, A const& a) { 
     o << a.i; 
     return o; 
    } 
}; 

爲什麼不標準允許你指定的參數應該去哪邊?讓我們假設它做,並添加left_ofright_of關鍵字指定:

struct B; 

struct A { 
    A left_of operator+(B const&) { 
     return *this; 
    } 
}; 

struct B { 
    B right_of operator+(A const&) { 
     return *this; 
    } 
}; 

當我們做什麼A a; B b; f(a + b);現在會發生?每個班級都有一名操作員來處理這種情況,這意味着我們無法做出決定。看到儘管許多運營商都應該成爲朋友,但無論如何不允許這類事情並不是什麼大問題,並且可以防止這些歧義。 (當然,你也可以定義一個會員操作員和一個免費會員,這會導致一個非常類似的問題。)

順便說一句,因爲事情是,你的friend operator<<的定義是不返回任何東西,這將弄亂鏈接。

+0

^得到你.....但第一個沒有任何意義.....完成了,因爲爲了保持所有操作員看起來都正確的所有操作員之間的一致性,被視爲一個參數? – howtechstuffworks 2012-02-19 17:10:05

+2

匿名downvoter,隨時發表評論。 – 2012-02-19 17:10:32

+0

^大聲笑,我猜有人搞亂....... – howtechstuffworks 2012-02-19 17:12:33