1. 程式人生 > >C++輸入輸出運算子的過載

C++輸入輸出運算子的過載

C++中的流插入運算子“>>”和流輸出運算子“<<”在C++類庫中提供的,所有的C++編譯系統都會在提供輸入流istream和輸出流ostream,cin、cout是分別是istream類和ostream類的物件,在類庫的標頭檔案中已經對“<<”、“>>”運算子進行了過載,那麼具體是怎麼實現的?

輸入運算子過載

istream& operator>>(istream& in, A& a)
{
    in>>"輸入的內容1">>"輸入的內容2"...;
    return in
; }

C++中輸入運算子的過載第一個引數是輸入流物件的引用,第二個引數是需要輸入的類物件的引用,我們一般將第二個引數定義為非const型別,否則無法賦值,返回值是輸入流istream&。

輸出運算子過載

ostream& operator<<(ostream& out,const A& a)
{
    out<<"輸出內容1"<<"輸出內容1"...;
    return out;
}

C++中輸出運算子過載的第一個引數是輸出流物件的引用,第二個引數是需要輸出的類物件的引用,我們一般將第二個引數定義為const型別,因為輸出時不需要改變物件的,返回值是輸出流ostream&。

為什麼將輸入輸出運算子定義為friend函式?

共同點就是將輸入運算子過載函式和輸出運算子過載函式都宣告為友元類,為什麼這樣設計呢?

友元函式

我們知道友元函式是可以被任意的類呼叫,實現類共享,減少不必要的系統開銷,提高效率,使得其他類可以訪問該類的私有變數。但也有缺點,就是破壞了類的封裝性,一般情況下不建議使用。

友元函式的使用場景

  • 在輸入輸出運算子過載
  • 當兩個類需要共享資料

原因

在這裡定義為友元函式,因為友元函式中不包含this指標,我們要求第一個引數一定是輸入輸出流的引用,否則程式碼就會變成 a << cout ,不滿足我們的習慣。
我們每個物件都可能會用到輸入輸出,所以定義為友元函式,使得我們的函式可以備任意類呼叫。