輸入輸出運算子的過載

2021-09-04 11:23:22 字數 2294 閱讀 2582

運算子過載相信大家都不陌生。運算子函式通常分為兩種形式:一類是在類中定義的運算子成員函式,稱之為類成員運算子;另一種在類之外定義的運算子過載,通常以該類的友元形式,稱之為友元運算子。

1、過載輸入輸出運算子的形式。常見的形式如下:

型別中宣告友元函式(友元函式必須在類中宣告)

class complex;

friend ostream & operator<<( ostream & os,const complex & c);

friend istream & operator>>( istream & is,complex & c);

private:

double real,imag;

};

具體的定義:

ostream & operator<<( ostream & os,const complex & c)

istream & operator>>( istream & is,complex & c)

2、過載輸入輸出運算子函式的引數。

答:由以上形式可以知道是兩個引數。

(1)第乙個引數是非常量的(輸出/輸入)流的引用。

之所以ostream是非常量的原因是:向流寫入內容會改變流的狀態。必須是引用的原因是:不用引用的話就是按值傳遞,而iostream(ostream/istream)規定是不允許拷貝器副本的,所以必須要傳引用。對於過載輸入運算子它的第乙個引數應該也是這個道理。(注:cout 是 ostream 類的物件。ostream 類和 cout 都是在標頭檔案 中宣告的。)

(2)第二個引數輸入和輸出運算子的過載則不同:

輸出運算子過載:對於過載輸出運算子而言第二個引數是乙個const的引用,該常量就是我們想要列印的類型別。採用引用的原因是我們希望避免複製實參;而之所以是常量的原因是通常情況下我們只是列印該形參預設不允許修改物件的內容。

輸入運算子過載:對於過載輸入運算子而言第二個引數必須是乙個非const的引用。原因是它要儲存我們讀取到的資料,所以這個形參一定是能修改的才行。

3、為什麼看到的過載輸入輸出運算子都選擇友元函式的形式,而加/減/乘/除等符號的過載亦可採用成員函式形式?

通常過載輸入輸出(運算子)時必須是非成員函式過載,主要是為了與iostream標準庫相容。

為了與標準io庫一致,過載後的符號的左側應該是流的引用,右側是物件的引用。(如,cout<<"hello!";或cin>>tmp;等。)

但是如果過載為類的成員函式的話,運算子左側是物件的引用,右側是流的引用。(ps:事實的確如此,回想一下成員函式的過載都是物件在前運算符號在後。)也就是說其形式為:

sales_data  data;

data << cout;//如果operator《是sales_data的成員。

顯然這就與標準的io庫不一致了。所以為了與iostream標準庫相容,輸入輸出運算子盡量不過載為類的成員函式,大多過載為類的友元函式或普通函式。

4、如果強行的選擇成類的成員函式的形式行不行?

根據前面說的應該也能看出來,強行的話肯定是行的。只不過看著太彆扭了。

老實說這樣用的幾乎不會用到,如果感興趣的話可以看看 這個。

5、最後放乙個string的類,功能並不是很完全,但包括是常用的過載實現。

#include #include using namespace std;

class string;

string::string(const char* str)else

}string::string(const string &other)

m_data=new char[strlen(other.m_data)+1];

strcpy(m_data,other.m_data);

}string::~string() }

string & string::operator=(const string &other)

} return *this;

}string & string::operator+(const string &other)

else if(m_data==null)else

return newstring;

}bool string::operator == (const string &other)

int string::getlength()

ostream & operator<<(ostream &os,const string &str)

int main()

過載輸入輸出運算子

我們平時可以用流 std cout str n 輸出 輸入字串和整型等內建型別的值。但是對於我們自定義的類,比如 student 類,卻不能直接通過 cout student 這樣的形式來輸出類的內容或給類賦值。怎麼辦呢?我們可以通過過載輸出 輸入運算子,讓自定義的類也支援這樣的操作。通常情況下,輸...

過載輸入輸出運算子

過載輸入輸出運算子 過載輸出運算子 第二個引數一般來說是乙個常量的引用,該常量是我們想要輸出的類型別。用引用是因為我們希望避免複製實參 用常量是因為通常列印物件的時候不需要改變物件的內容 輸出運算子應儘量減少格式化的操作,尤其是換行符,這樣有利於使用者對輸出格式的控制。一般會宣告為友元函式 frie...

過載輸入輸出運算子

一 實驗目的 1 在實驗2 的基礎上,在類 person 中,以友元形式過載輸入輸出運算子 2 通過 cout cout display 顯示右值物件的資訊。3 通過 cin teach 或 cin stud 呼叫右值類的虛函式 setvalue 通過鍵盤輸入右值物件的資訊。1 include2 i...