最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++重載輸入和輸出運算符詳解

 更新時間:2023年09月12日 08:31:59   作者:向陽逐夢  
在C++中,標(biāo)準(zhǔn)庫本身已經(jīng)對左移運算符<<和右移運算符>>分別進(jìn)行了重載,使其能夠用于不同數(shù)據(jù)的輸入輸出,本節(jié)以前面的?complex?類為例來演示輸入輸出運算符的重載,需要的朋友可以參考下

在C++中,標(biāo)準(zhǔn)庫本身已經(jīng)對左移運算符<<和右移運算符>>分別進(jìn)行了重載,使其能夠用于不同數(shù)據(jù)的輸入輸出,但是輸入輸出的對象只能是 C++ 內(nèi)置的數(shù)據(jù)類型(例如 bool、int、double 等)和標(biāo)準(zhǔn)庫所包含的類類型(例如 string、complex、ofstream、ifstream 等)。

如果我們自己定義了一種新的數(shù)據(jù)類型,需要用輸入輸出運算符去處理,那么就必須對它們進(jìn)行重載。本節(jié)以前面的 complex 類為例來演示輸入輸出運算符的重載。

其實 C++ 標(biāo)準(zhǔn)庫已經(jīng)提供了 complex 類,能夠很好地支持復(fù)數(shù)運算,但是這里我們又自己定義了一個 complex 類,這樣做僅僅是為了教學(xué)演示。

本節(jié)要達(dá)到的目標(biāo)是讓復(fù)數(shù)的輸入輸出和 int、float 等基本類型一樣簡單。假設(shè) num1、num2 是復(fù)數(shù),那么輸出形式就是:

cout<<num1<<num2<<endl;

輸入形式就是:

cin>>num1>>num2;

cout 是 ostream 類的對象,cin 是 istream 類的對象,要想達(dá)到這個目標(biāo),就必須以全局函數(shù)(友元函數(shù))的形式重載<<>>,否則就要修改標(biāo)準(zhǔn)庫中的類,這顯然不是我們所期望的。

重載輸入運算符>>

下面我們以全局函數(shù)的形式重載>>,使它能夠讀入兩個 double 類型的數(shù)據(jù),并分別賦值給復(fù)數(shù)的實部和虛部:

    istream & operator>>(istream &in, complex &A){
        in >> A.m_real >> A.m_imag;
        return in;
    }

istream 表示輸入流,cin 是 istream 類的對象,只不過這個對象是在標(biāo)準(zhǔn)庫中定義的。之所以返回 istream 類對象的引用,是為了能夠連續(xù)讀取復(fù)數(shù),讓代碼書寫更加漂亮,例如:

complex c1, c2;
cin>>c1>>c2;

如果不返回引用,那就只能一個一個地讀取了:

complex c1, c2;
cin>>c1;
cin>>c2;

另外,運算符重載函數(shù)中用到了 complex 類的 private 成員變量,必須在 complex 類中將該函數(shù)聲明為友元函數(shù):

friend istream & operator>>(istream & in , complex &a);

>>運算符可以按照下面的方式使用:

complex c;
cin>>c;

當(dāng)輸入1.45 2.34↙后,這兩個小數(shù)就分別成為對象 c 的實部和虛部了。cin>> c;這一語句其實可以理解為:

operator<<(cin , c);

重載輸出運算符<<

同樣地,我們也可以模仿上面的形式對輸出運算符>>進(jìn)行重載,讓它能夠輸出復(fù)數(shù),請看下面的代碼:

    ostream & operator<<(ostream &out, complex &A){
        out << A.m_real <<" + "<< A.m_imag <<" i ";
        return out;
    }

ostream 表示輸出流,cout 是 ostream 類的對象。由于采用了引用的方式進(jìn)行參數(shù)傳遞,并且也返回了對象的引用,所以重載后的運算符可以實現(xiàn)連續(xù)輸出。為了能夠直接訪問 complex 類的 private 成員變量,同樣需要將該函數(shù)聲明為 complex 類的友元函數(shù):

friend ostream & operator<<(ostream &out, complex &A);

綜合演示

結(jié)合輸入輸出運算符的重載,重新實現(xiàn) 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;
    }

運行結(jié)果:

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++重載輸入和輸出運算符詳解的詳細(xì)內(nèi)容,更多關(guān)于C++重載輸入和輸出運算符的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VS2022中使用Copilot的圖文教程

    VS2022中使用Copilot的圖文教程

    大家都知道Copilot可以自動幫助寫代碼,那么這個工具是如果使用的呢?很多朋友不是很清楚,今天小編給大家分享一篇教程關(guān)于VS2022中使用Copilot的圖文教程,感興趣的朋友一起看看吧
    2022-04-04
  • C語言中strcmp的實現(xiàn)原型

    C語言中strcmp的實現(xiàn)原型

    這篇文章主要介紹了C語言中strcmp的實現(xiàn)原型的相關(guān)資料,這里提供實例幫助大家理解這部分內(nèi)容,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • C++圖文并茂分析講解內(nèi)存管理

    C++圖文并茂分析講解內(nèi)存管理

    本章主要介紹C語言與C++的內(nèi)存管理,以C++的內(nèi)存分布作為引入,介紹C++不同于C語言的內(nèi)存管理方式(new delete對比 malloc free),感興趣的朋友來看看吧
    2022-09-09
  • 基于select、poll、epoll的區(qū)別詳解

    基于select、poll、epoll的區(qū)別詳解

    本篇文章是對select、poll、epoll之間的區(qū)別進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • VSCode如何使用最新的C++20(推薦)

    VSCode如何使用最新的C++20(推薦)

    這篇文章主要介紹了VSCode使用最新的C++20的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 詳解C++句柄類

    詳解C++句柄類

    本篇文章給大家詳細(xì)分析了C++句柄類的相關(guān)知識點,對此有需要的朋友跟著學(xué)習(xí)參考下吧。
    2018-06-06
  • C語言中字符型數(shù)組的實現(xiàn)示例

    C語言中字符型數(shù)組的實現(xiàn)示例

    本文主要介紹了C語言中字符型數(shù)組的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • 淺析C語言調(diào)試器GDB和LLDB的使用方法

    淺析C語言調(diào)試器GDB和LLDB的使用方法

    這篇文章主要介紹了C語言調(diào)試器GDB和LLDB的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • C/C++宏替換實現(xiàn)詳解

    C/C++宏替換實現(xiàn)詳解

    這篇文章主要介紹了C/C++宏替換實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C語言 結(jié)構(gòu)體(Struct)詳解及示例代碼

    C語言 結(jié)構(gòu)體(Struct)詳解及示例代碼

    本文主要介紹C語言 結(jié)構(gòu)體的知識,學(xué)習(xí)C語言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下
    2016-08-08

最新評論

教育| 浏阳市| 密云县| 南溪县| 长春市| 高清| 乃东县| 息烽县| 马公市| 云梦县| 巩义市| 绍兴市| 信丰县| 佛山市| 英吉沙县| 定南县| 炎陵县| 乌兰浩特市| 阿克陶县| 东乡族自治县| 峡江县| 密山市| 藁城市| 治多县| 邵阳县| 肇源县| 绥德县| 炉霍县| 肥乡县| 筠连县| 道真| 永德县| 商水县| 淳化县| 龙江县| 合阳县| 赤壁市| 门源| 阿克苏市| 株洲市| 日喀则市|