欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符

 更新時(shí)間:2015年09月21日 14:46:11   投稿:goldensun  
這篇文章主要介紹了詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

C++的流插入運(yùn)算符“<<”和流提取運(yùn)算符“>>”是C++在類庫(kù)中提供的,所有C++編譯系統(tǒng)都在類庫(kù)中提供輸入流類istream和輸出流類ostream。cin和cout分別是istream類和ostream類的對(duì)象。在類庫(kù)提供的頭文件中已經(jīng)對(duì)“<<”和“>>”進(jìn)行了重載,使之作為流插入運(yùn)算符和流提取運(yùn)算符,能用來(lái)輸出和輸入C++標(biāo)準(zhǔn)類型的數(shù)據(jù)。因此,凡是用“cout<<”和“cin>>”對(duì)標(biāo)準(zhǔn)類型數(shù)據(jù)進(jìn)行輸入輸出的,都要用#include 把頭文件包含到本程序文件中。

用戶自己定義的類型的數(shù)據(jù),是不能直接用“<<”和“>>”來(lái)輸出和輸入的。如果想用它們輸出和輸入自己聲明的類型的數(shù)據(jù),必須對(duì)它們重載。

對(duì)“<<”和“>>”重載的函數(shù)形式如下:

  istream & operator >> (istream &, 自定義類 &);
  ostream & operator << (ostream &, 自定義類 &);


即重載運(yùn)算符“>>”的函數(shù)的第一個(gè)參數(shù)和函數(shù)的類型都必須是istream&類型,第二個(gè)參數(shù)是要進(jìn)行輸入操作的類。重載“<<”的函數(shù)的第一個(gè)參數(shù)和函數(shù)的類型都必須是ostream&類型,第二個(gè)參數(shù)是要進(jìn)行輸出操作的類。因此,只能將重載“>>”和“<<”的函數(shù)作為友元函數(shù)或普通的函數(shù),而不能將它們定義為成員函數(shù)。
重載流插入運(yùn)算符“<<”

在程序中,人們希望能用插入運(yùn)算符“<<”來(lái)輸出用戶自己聲明的類的對(duì)象的信息,這就需要重載流插入運(yùn)算符“<<”。

[例] 用重載的“<<”輸出復(fù)數(shù)。

#include <iostream>
using namespace std;
class Complex
{
  public:
  Complex( ){real=0;imag=0;}
  Complex(double r,double i){real=r;imag=i;}
  Complex operator + (Complex &c2); //運(yùn)算符“+”重載為成員函數(shù)
  friend ostream& operator << (ostream&,Complex&); //運(yùn)算符“<<”重載為友元函數(shù)
  private:
  double real;
  double imag;
};
Complex Complex::operator + (Complex &c2)//定義運(yùn)算符“+”重載函數(shù)
{
  return Complex(real+c2.real,imag+c2.imag);
}
ostream& operator << (ostream& output,Complex& c) //定義運(yùn)算符“<<”重載函數(shù)
{
  output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
  return output;
}
int main( )
{
  Complex c1(2,4),c2(6,10),c3;
  c3=c1+c2;
  cout<<c3;
  return 0;
}

注意,在Visual C++ 6.0環(huán)境下運(yùn)行時(shí),需將第一行改為#include <iostream.h>,并刪去第2行,否則編譯不能通過(guò)。運(yùn)行結(jié)果為:

(8+14i)

可以看到在對(duì)運(yùn)算符“<<”重載后,在程序中用“<<”不僅能輸出標(biāo)準(zhǔn)類型數(shù)據(jù),而且可以輸出用戶自己定義的類對(duì)象。用“cout<<c3”即能以復(fù)數(shù)形式輸出復(fù)數(shù)對(duì)象c3的值。形式直觀,可讀性好,易于使用。

下面對(duì)怎樣實(shí)現(xiàn)運(yùn)算符重載作一些說(shuō)明。程序中重載了運(yùn)算符“<<”,運(yùn)算符重載函數(shù)中的形參output是ostream類對(duì)象的引用,形參名output是用戶任意起的。分析main函數(shù)最后第二行:

  cout<<c3;


運(yùn)算符“<<”的左面是cout,前面已提到cout是ostream類對(duì)象。“<<”的右面是c3,它是Complex類對(duì)象。由于已將運(yùn)算符“<<”的重載函數(shù)聲明為Complex類的友元函數(shù),編譯系統(tǒng)把“cout<<c3”解釋為

  operator<<(cout, c3)


即以cout和c3作為實(shí)參,調(diào)用下面的operator<<函數(shù):

  ostream& operator<<(ostream& output,Complex& c)
  {
    output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
    return output;
  }


調(diào)用函數(shù)時(shí),形參output成為cout的引用,形參c成為c3的引用。因此調(diào)用函數(shù)的過(guò)程相當(dāng)于執(zhí)行:

cout<<″(″<<c3.real<<″+″<<c3.imag<<″i)″<<endl; return cout;


請(qǐng)注意,上一行中的“<<”是C++預(yù)定義的流插入符,因?yàn)樗覀?cè)的操作數(shù)是字符串常量和double類型數(shù)據(jù)。執(zhí)行cout語(yǔ)句輸出復(fù)數(shù)形式的信息。然后執(zhí)行return語(yǔ)句。

請(qǐng)思考,return  output的作用是什么?回答是能連續(xù)向輸出流插入信息。output是ostream類的對(duì)象,它是實(shí)參cout的引用,也就是cout通過(guò)傳送地址給output,使它們二者共享同一段存儲(chǔ)單元,或者說(shuō)output是cout的別名。因此,return output就是return cout,將輸出流cout的現(xiàn)狀返回,即保留輸出流的現(xiàn)狀。

請(qǐng)問(wèn)返回到哪里?剛才是在執(zhí)行

  cout<<c3;


在已知cout<<c3的返回值是cout的當(dāng)前值。如果有以下輸出:

  cout<<c3<<c2;


先處理

  cout<<c3



  (cout<<c3)<<c2;


而執(zhí)行(cout<<c3)得到的結(jié)果就是具有新內(nèi)容的流對(duì)象cout,因此,(cout<<c3)<<c2相當(dāng)于cout(新值)<<c2。運(yùn)算符“<<”左側(cè)是ostream類對(duì)象cout,右側(cè)是Complex類對(duì)象c2,則再次調(diào)用運(yùn)算符“<<”重載函數(shù),接著向輸出流插入c2的數(shù)據(jù)。現(xiàn)在可以理解了為什么C++規(guī)定運(yùn)算符“<<”重載函數(shù)的第一個(gè)參數(shù)和函數(shù)的類型都必須是ostream類型的引用,就是為了返回cout的當(dāng)前值以便連續(xù)輸出。

請(qǐng)讀者注意區(qū)分什么情況下的“<<”是標(biāo)準(zhǔn)類型數(shù)據(jù)的流插入符,什么情況下的“<<”是重載的流插入符。如

  cout<<c3<<5<<endl;


有下劃線的是調(diào)用重載的流插入符,后面兩個(gè)“<<”不是重載的流插入符,因?yàn)樗挠覀?cè)不是Complex類對(duì)象而是標(biāo)準(zhǔn)類型的數(shù)據(jù),是用預(yù)定義的流插入符處理的。

還有一點(diǎn)要說(shuō)明,在本程序中,在Complex類中定義了運(yùn)算符“<<”重載函數(shù)為友元函數(shù),因此只有在輸出Complex類對(duì)象時(shí)才能使用重載的運(yùn)算符,對(duì)其他類型的對(duì)象是無(wú)效的。如

  cout<<time1; //time1是Time類對(duì)象,不能使用用于Complex類的重載運(yùn)算符


重載流提取運(yùn)算符“>>”

C++預(yù)定義的運(yùn)算符“>>”的作用是從一個(gè)輸入流中提取數(shù)據(jù),如“cin>>i;”表示從輸入流中提取一個(gè)整數(shù)賦給變量i(假設(shè)已定義i為int型)。重載流提取運(yùn)算符的目的是希望將“>>”用于輸入自定義類型的對(duì)象的信息。

[例] 在上例的基礎(chǔ)上,增加重載流提取運(yùn)算符“>>”,用“cin>>”輸入復(fù)數(shù),用“cout<<”輸出復(fù)數(shù)。

#include <iostream>
using namespace std;
class Complex
{
  public:
  friend ostream& operator << (ostream&,Complex&); //聲明重載運(yùn)算符“<<”
  friend istream& operator >> (istream&,Complex&); //聲明重載運(yùn)算符“>>”
  private:
  double real;
  double imag;
};
ostream& operator << (ostream& output,Complex& c) //定義重載運(yùn)算符“<<”
{
  output<<"("<<c.real<<"+"<<c.imag<<"i)";
  return output;
}
istream& operator >> (istream& input,Complex& c) //定義重載運(yùn)算符“>>”
{
  cout<<"input real part and imaginary part of complex number:";
  input>>c.real>>c.imag;
  return input;
}
int main( )
{
  Complex c1,c2;
  cin>>c1>>c2;
  cout<<"c1="<<c1<<endl;
  cout<<"c2="<<c2<<endl;
  return 0;
}

運(yùn)行情況如下:

input real part and imaginary part of complex number:3 6↙
input real part and imaginary part of complex number:4 10↙
c1=(3+6i)
c2=(4+10i)

以上運(yùn)行結(jié)果無(wú)疑是正確的,但并不完善。在輸入復(fù)數(shù)的虛部為正值時(shí),輸出的結(jié)果是沒(méi)有問(wèn)題的,但是虛部如果是負(fù)數(shù),就不理想,請(qǐng)觀察輸出結(jié)果。

input real part and imaginary part of complex number:3 6↙
input real part and imaginary part of complex number:4 -10↙
c1=(3+6i)
c2=(4+-10i)

根據(jù)先調(diào)試通過(guò),最后完善的原則,可對(duì)程序作必要的修改。將重載運(yùn)算符“<<”函數(shù)修改如下:

ostream& operator << (ostream& output,Complex& c)
{
  output<<"("<<c.real;
  if(c.imag>=0) output<<"+";//虛部為正數(shù)時(shí),在虛部前加“+”號(hào)
  output<<c.imag<<"i)"<<endl; //虛部為負(fù)數(shù)時(shí),在虛部前不加“+”號(hào)
  return output;
}


這樣,運(yùn)行時(shí)輸出的最后一行為c2=(4-10i) 。

可以看到,在C++中,運(yùn)算符重載是很重要的、很有實(shí)用意義的。它使類的設(shè)計(jì)更加豐富多彩,擴(kuò)大了類的功能和使用范圍,使程序易于理解,易于對(duì)對(duì)象進(jìn)行操作,它體現(xiàn)了為用戶著想、方便用戶使用的思想。有了運(yùn)算符重載,在聲明了類之后,人們就可以像使用標(biāo)準(zhǔn)類型一樣來(lái)使用自己聲明的類。類的聲明往往是一勞永逸的,有了好的類,用戶在程序中就不必定義許多成員函數(shù)去完成某些運(yùn)算和輸入輸出的功能,使主函數(shù)更加簡(jiǎn)單易讀。好的運(yùn)算符重載能體現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)思想。

可以看到,在運(yùn)算符重載中使用引用(reference)的重要性。利用引用作為函數(shù)的形參可以在調(diào)用函數(shù)的過(guò)程中不是用傳遞值的方式進(jìn)行虛實(shí)結(jié)合,而是通過(guò)傳址方式使形參成為實(shí)參的別名,因此不生成臨時(shí)變量(實(shí)參的副本),減少了時(shí)間和空間的開(kāi)銷。此外,如果重載函數(shù)的返回值是對(duì)象的引用時(shí),返回的不是常量,而是引用所代表的對(duì)象,它可以出現(xiàn)在賦值號(hào)的左側(cè)而成為左值(left value),可以被賦值或參與其他操作(如保留cout流的當(dāng)前值以便能連續(xù)使用“<<”輸出)。但使用引用時(shí)要特別小心,因?yàn)樾薷牧艘镁偷扔谛薷牧怂淼膶?duì)象。

相關(guān)文章

  • c++網(wǎng)絡(luò)編程下Linux的epoll技術(shù)和Windows下的IOCP模型

    c++網(wǎng)絡(luò)編程下Linux的epoll技術(shù)和Windows下的IOCP模型

    c++ 網(wǎng)絡(luò)編程LINUX-epoll/windows-IOCP下socket opoll函數(shù)用法 優(yōu)于select方法的epoll 以及windows下IOCP 解決多進(jìn)程服務(wù)端創(chuàng)建進(jìn)程資源浪費(fèi)問(wèn)題,感興趣的小伙伴一起來(lái)學(xué)習(xí)吧
    2021-08-08
  • 詳解C語(yǔ)言中for循環(huán)與while循環(huán)的用法

    詳解C語(yǔ)言中for循環(huán)與while循環(huán)的用法

    這篇文章主要通過(guò)幾個(gè)示例為大家介紹一下C語(yǔ)言中for循環(huán)與while循環(huán)的用法以及二者的區(qū)別,文中的代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-07-07
  • C++ 中動(dòng)態(tài)鏈接庫(kù)--導(dǎo)入和導(dǎo)出的實(shí)例詳解

    C++ 中動(dòng)態(tài)鏈接庫(kù)--導(dǎo)入和導(dǎo)出的實(shí)例詳解

    這篇文章主要介紹了C++ 中動(dòng)態(tài)鏈接庫(kù)--導(dǎo)入和導(dǎo)出的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C++實(shí)現(xiàn)LeetCode(87.攪亂字符串)

    C++實(shí)現(xiàn)LeetCode(87.攪亂字符串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(87.攪亂字符串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++設(shè)計(jì)模式之單例模式詳解

    C++設(shè)計(jì)模式之單例模式詳解

    這篇文章主要介紹了C++設(shè)計(jì)模式之單例模式,本文同時(shí)給出了數(shù)種單例模式的實(shí)現(xiàn)代碼,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • VS+QT編譯環(huán)境中字符亂碼問(wèn)題解決方法

    VS+QT編譯環(huán)境中字符亂碼問(wèn)題解決方法

    編碼就是把?個(gè)字符編碼成二進(jìn)制碼存起來(lái)的方式,而解碼就是把這個(gè)二進(jìn)制碼按照原本編碼的規(guī)則還原成原來(lái)的字符,這篇文章主要介紹了VS+QT編譯環(huán)境中字符亂碼問(wèn)題詳解,需要的朋友可以參考下
    2024-01-01
  • c++難以發(fā)現(xiàn)的bug(有趣)

    c++難以發(fā)現(xiàn)的bug(有趣)

    這篇文章主要介紹了c++難以發(fā)現(xiàn)的bug(有趣)的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • 線程池的原理與實(shí)現(xiàn)詳解

    線程池的原理與實(shí)現(xiàn)詳解

    下面利用C語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線程池,為了使得這個(gè)線程池庫(kù)使用起來(lái)更加方便,特在C實(shí)現(xiàn)中加入了一些OO的思想,與Objective-C不同,它僅僅是使用了struct來(lái)模擬了c++中的類,其實(shí)這種方式在linux內(nèi)核中大量可見(jiàn)
    2013-09-09
  • C++實(shí)現(xiàn)LeetCode(40.組合之和之二)

    C++實(shí)現(xiàn)LeetCode(40.組合之和之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(40.組合之和之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ 程序員為什么看不起php程序員

    C++ 程序員為什么看不起php程序員

    由于當(dāng)今市場(chǎng)狀況,各種培訓(xùn)班飛起,PHPer越來(lái)越多,學(xué)習(xí)成本很低。導(dǎo)致了很多人對(duì)PHP的誤解。其實(shí)PHP學(xué)到深入的時(shí)候,所需知識(shí)很多,并不是表面看到的那樣。另外,PHP確實(shí)嚴(yán)謹(jǐn)性不高,這個(gè)跟C++,java確實(shí)都沒(méi)法比。但是,PHP在web開(kāi)發(fā)中的效率,是其他語(yǔ)言所不能比的
    2017-02-02

最新評(píng)論