《Cracking the Coding Interview程式設計師面試金典》----C++過載>>和
在C++中,標準庫本身已經對左移運算子
如果我們自己定義了一種新的資料型別,需要用輸入輸出運算子去處理,那麼就必須對它們進行過載。本節以前面的 complex 類為例來演示輸入輸出運算子的過載。
istream 表示輸入流,cin 是 istream 類的物件,只不過這個物件是在標準庫中定義的。之所以返回 istream 類物件的引用,是為了能夠連續讀取複數,讓程式碼書寫更加漂亮,例如:
ostream 表示輸出流,cout 是 ostream 類的物件。由於採用了引用的方式進行引數傳遞,並且也返回了物件的引用,所以過載後的運算子可以實現連續輸出。
為了能夠直接訪問 complex 類的 private 成員變數,同樣需要將該函式宣告為 complex 類的友元函式:
執行結果:
2.4 3.6↙
4.8 1.7↙
c1 + c2 = 7.2 + 5.3 i
c1 - c2 = -2.4 + 1.9 i
c1 * c2 = 5.4 + 21.36 i
c1 / c2 = 0.942308 + 0.705128 i
<<
和右移運算子>>
分別進行了過載,使其能夠用於不同資料的輸入輸出,但是輸入輸出的物件只能是
C++ 內建的資料型別(例如 bool、int、double 等)和標準庫所包含的類型別(例如 string、complex、ofstream、ifstream 等)。如果我們自己定義了一種新的資料型別,需要用輸入輸出運算子去處理,那麼就必須對它們進行過載。本節以前面的 complex 類為例來演示輸入輸出運算子的過載。
其實 C++ 標準庫已經提供了 complex 類,能夠很好地支援複數運算,但是這裡我們又自己定義了一個 complex 類,這樣做僅僅是為了教學演示。本節要達到的目標是讓複數的輸入輸出和 int、float 等基本型別一樣簡單。假設 num1、num2 是複數,那麼輸出形式就是:
cout<<num1<<num2<<endl;
輸入形式就是:cin>>num1>>num2;
cout 是 istream 類的物件,cin 是 ostream 類的物件,要想達到這個目標,就必須以全域性函式(友元函式)的形式過載<<
和>>
,否則就要修改標準庫中的類,這顯然不是我們所期望的。過載輸入運算子>>
下面我們以全域性函式的形式過載>>
,使它能夠讀入兩個
double 型別的資料,並分別賦值給複數的實部和虛部:
- istream & operator>>(istream &in, complex &A){
- in >> A.m_real >> A.m_imag;
- return in;
- }
complex c1, c2;
cin>>c1>>c2;
complex c1, c2;
cin>>c1;
cin>>c2;
friend istream & operator>>(istream & in , complex &a);
>>
運算子可以按照下面的方式使用:
complex c;
cin>>c;
1.45
2.34↙
後,這兩個小數就分別成為物件 c 的實部和虛部了。cin>>
c;
這一語句其實可以理解為:
operator<<(cin , c);
過載輸出運算子<<
同樣地,我們也可以模仿上面的形式對輸出運算子>>
進行過載,讓它能夠輸出複數,請看下面的程式碼:
- ostream & operator<<(ostream &out, complex &A){
- out << A.m_real <<" + "<< A.m_imag <<" i ";
- return out;
- }
為了能夠直接訪問 complex 類的 private 成員變數,同樣需要將該函式宣告為 complex 類的友元函式:
friend ostream & operator<<(ostream &out, complex &A);
綜合演示
結合輸入輸出運算子的過載,重新實現 complex 類:- #include <iostream>
- using namespace std;
- class complex{
- public:
- complex(double real = 0.0, double imag = 0.0): m_real(real), m_imag(imag){ };
- public:
- friend complex operator+(const complex & A, const complex & B);
- friend complex operator-(const complex & A, const complex & B);
- friend complex operator*(const complex & A, const complex & B);
- friend complex operator/(const complex & A, const complex & B);
- friend istream & operator>>(istream & in, complex & A);
- friend ostream & operator<<(ostream & out, complex & A);
- private:
- double m_real; //實部
- double m_imag; //虛部
- };
- //過載加法運算子
- complex operator+(const complex & A, const complex &B){
- complex C;
- C.m_real = A.m_real + B.m_real;
- C.m_imag = A.m_imag + B.m_imag;
- return C;
- }
- //過載減法運算子
- complex operator-(const complex & A, const complex &B){
- complex C;
- C.m_real = A.m_real - B.m_real;
- C.m_imag = A.m_imag - B.m_imag;
- return C;
- }
- //過載乘法運算子
- complex operator*(const complex & A, const complex &B){
- complex C;
- C.m_real = A.m_real * B.m_real - A.m_imag * B.m_imag;
- C.m_imag = A.m_imag * B.m_real + A.m_real * B.m_imag;
- return C;
- }
- //過載除法運算子
- complex operator/(const complex & A, const complex & B){
- complex C;
- double square = A.m_real * A.m_real + A.m_imag * A.m_imag;
- C.m_real = (A.m_real * B.m_real + A.m_imag * B.m_imag)/square;
- C.m_imag = (A.m_imag * B.m_real - A.m_real * B.m_imag)/square;
- return C;
- }
- //過載輸入運算子
- istream & operator>>(istream & in, complex & A){
- in >> A.m_real >> A.m_imag;
- return in;
- }
- //過載輸出運算子
- ostream & operator<<(ostream & out, complex & A){
- out << A.m_real <<" + "<< A.m_imag <<" i ";;
- return out;
- }
- int main(){
- complex c1, c2, c3;
- cin>>c1>>c2;
- c3 = c1 + c2;
- cout<<"c1 + c2 = "<<c3<<endl;
- c3 = c1 - c2;
- cout<<"c1 - c2 = "<<c3<<endl;
- c3 = c1 * c2;
- cout<<"c1 * c2 = "<<c3<<endl;
- c3 = c1 / c2;
- cout<<"c1 / c2 = "<<c3<<endl;
- return 0;
- }
2.4 3.6↙
4.8 1.7↙
c1 + c2 = 7.2 + 5.3 i
c1 - c2 = -2.4 + 1.9 i
c1 * c2 = 5.4 + 21.36 i
c1 / c2 = 0.942308 + 0.705128 i
相關文章
- 【程式設計師面試金典】20180801程式設計師面試
- 【程式設計師面試金典】洪水程式設計師面試
- 程式設計師面試金典Chapter1程式設計師面試APT
- 好程式設計師java分享Java面試寶典:類的載入過程程式設計師Java面試
- 智力題(程式設計師面試經典)程式設計師面試
- Java初中級程式設計師面試題寶典Java程式設計師面試題
- 【JAVA面試資料】程式設計師面試之葵花寶典2Java面試程式設計師
- 【JAVA面試資料】程式設計師面試之葵花寶典1Java面試程式設計師
- 新書出版 |《Oracle程式設計師面試筆試寶典》新書Oracle程式設計師面試筆試
- 2024年程式設計師金九銀十面試寶典(持續更新中................)程式設計師面試
- 【程式設計師面試金典】三個空汽水瓶可以換一瓶汽水。程式設計師面試
- [演算法練習及思路-程式設計師面試金典(Java解法)]No85計算器演算法程式設計師面試Java
- 新書出版 |《資料庫程式設計師面試筆試寶典》新書資料庫程式設計師面試筆試
- 好程式設計師:Java程式設計師面試秘籍程式設計師Java面試
- [演算法練習及思路-程式設計師面試金典(Java解法)]No77連續數列演算法程式設計師面試Java
- 程式設計師程式碼面試指南程式設計師面試
- 【程式設計師面試寶典】確定兩串亂序同構程式設計師面試
- 好程式設計師Java教程之Java面試寶典Java IO篇程式設計師Java面試
- 好程式設計師Java教程分享經典Java main方法面試題程式設計師JavaAI面試題
- 程式設計師面試經驗程式設計師面試
- [演算法練習及思路-程式設計師面試金典(Java解法)]No46.漢諾塔問題演算法程式設計師面試Java
- C++面試寶典C++面試
- Java程式設計師面試時應注意的三個經典問題!Java程式設計師面試
- 前端程式設計師面試十八套路前端程式設計師面試
- IT程式設計師面試技巧有哪些?程式設計師面試
- 程式設計師菜鳥面試攻略程式設計師面試
- 好程式設計師Python培訓分享Python程式設計師面試技巧程式設計師Python面試
- 程式設計師面試備戰篇:18個經典MySQL面試專題解析(乾貨分享答案)程式設計師面試MySql
- 程式設計師面試神回覆,最後一個“過分”了!程式設計師面試
- 讀書日——我最推薦的一本技術書籍《程式設計師面試金典(第6版)》程式設計師面試
- 鄭州達內:設計師常的經典面試題面試題
- 程式設計師50+Java面試題程式設計師Java面試題
- 程式設計師面試所需的軟技能程式設計師面試
- Java程式設計師面試題及解答Java程式設計師面試題
- JAVA程式設計師面試題庫分享Java程式設計師面試題
- 準備程式設計師面試?你需要了解這 14 種程式設計面試模式程式設計師面試模式
- 好程式設計師大資料培訓分享大資料面試寶典三程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料面試寶典四程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料面試寶典六程式設計師大資料面試