2017-03-14 50 views
1

在下面的例子中,我想知道爲什麼我們使用通過引用ostream的調用。我在刪除&時遇到錯誤,但沒有完全收到錯誤消息。在對象中使用cout,爲什麼我們需要通過引用來調用

class MyArray{ 
    private: 
     int x[10]; 
    public: 
    MyArray(int n) 
    { 
     for (int i = 0; i < 10; i++) 
      x[i] = n; 


    } 
    friend ostream& operator<<(ostream& pa, MyArray ob); 
    }; 
    ostream& operator<<(ostream& pa, MyArray ob) 
    { 
     for (int i = 0; i < 10; i++) 
      pa << ob.x[i]; 
     return pa; 



    } 
    int main() 
    { 

     MyArray a(5); 
     cout << a; 
     return 0; 
    } 
+0

因爲'的std :: ostream'沒有可訪問的複製或移動構造 – WhiZTiM

+0

因爲如果我們按值傳遞它,我們需要複製COUT對象,這沒有任何意義 – Malice

+0

多一點的解釋將是完美的,我想我知道了。 謝謝@Malice WhizTiM – Arey

回答

0

std::ostream沒有「可訪問」移動或複製構造函數。從C++ 11開始,拷貝構造函數是deleted,即使移動構造函數是protected

當您返回值,(移動/拷貝構造函數非常必要,即使複製省略發生):

ostream operator<<(ostream& pa, MyArray ob){ 
    for (int i = 0; i < 10; i++) 
     pa << ob.x[i]; 
    return pa; //Move or Copy Constructor is required. 
} 

.............

std::ostream應該是執行高級別流輸出操作的對象的基類。它的意思是控制stream buffer的對象的基類。

複製std::cout是沒有意義的,因爲它的資源和它的指定控制流緩衝區負責將字符發送到程序的標準輸出。

相關問題