C++ 流插入和流提取運算符的重載

      網友投稿 962 2025-04-03

      01 流插入<<運算符的重載

      C++ 在輸出內容時,最常用的方式:

      std::cout << 1 <<"hello";

      1

      問題:

      那這條語句為什么能成立呢?

      cout 是什么?"<<" 運算符能用在 cout 上呢?

      原因:

      實際上,cout 是在 iostream 頭文件中定義的 ostream 類的對象。

      “<<” 能夠用在 cout 上是因為,在 ostream 類對 “<<” 進行了重載。

      對于std::cout << 1 <<"hello";這條語句,有可能按以下的方式重載成 ostream 類的成員函數:

      ostream & ostream::operator<<(int n) { .... // 輸出n整型的代碼 return *this; } ostream & ostream::operator<<(const char * s) { .... // 輸出s字符串的代碼 return *this; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      std::cout << 1;語句,等價于cout.operator<<(1);

      std::cout << "hello";語句,等價于cout.operator<<("hello");

      std::cout << 1 <<"hello";語句,等價于( cout.operator<<(1) ).operator<<("hello");

      02 流插入<<運算符重載的例子

      假定我們要想把某個對象里的內容進行打印輸出,那么我們可以重載 ostream 類的流插入 << 運算符。

      下面以 CStudent 類作為例子:

      class CStudent // 學生類 { public: // 構造函數 CStudent(int id = 0, int age = 0, string name = ""):m_id(id), m_age(age), m_name(name) { } // 將該函數聲明成友元函數 // 目的是使得函數可以訪問CStudent類的私有成員變量 friend ostream & operator<<(ostream & o, const CStudent & s); private: int m_age; // 年齡 int m_id; // ID號 string m_name; // 名字 }; // 重載ostream對象的流插入<<運算符函數 // 目的是使得能打印輸出CStudent對象的信息 ostream & operator<<(ostream & o, const CStudent & s) { o << s.m_id << "," << s.m_age << "," << s.m_name; return o; } int main() { CStudent stu(1, 20, "小林coding"); std::cout << stu ; // 輸出std對象的全部信息 return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      輸出結果:

      1,20,小林coding

      1

      需要注意是 ostream & operator<<(ostream & o, const CStudent & s) 函數是全局的,所以函數的第一個參數必須要傳入 ostream 的對象,并且 CStudent 類需要將此函數聲明成友元函數,使得函數可以訪問 CStudent 類的私有成員變量。

      03 流提取>>運算符重載的例子

      還是以 CStudent 類作為例子,假設想通過鍵盤的輸入的內容,來初始化對象,則我們可以重載 istream 類的流提取 >> 運算符。

      class CStudent // 學生類 { public: // 構造函數 CStudent(int id = 0, int age = 0, string name = ""):m_id(id), m_age(age), m_name(name) { } // 將該函數聲明成友元函數 // 目的是使得函數可以訪問CStudent類的私有成員變量 friend ostream & operator<<(ostream & o, const CStudent & s); // 將該函數聲明成友元函數 // 目的是使得函數可以給CStudent類的私有成員變量進行賦值 friend istream & operator>>(istream & is, CStudent & s); private: int m_age; // 年齡 int m_id; // ID號 string m_name; // 名字 }; // 重載ostream對象的流插入<<運算符函數 // 目的是使得能打印輸出CStudent對象的信息 ostream & operator<<(ostream & o, const CStudent & s) { o << s.m_id << "," << s.m_age << "," << s.m_name; return o; } // 重載istream對象的流提取>>運算符函數 // 目的是使得初始化CStudent對象的內容 istream & operator>>(istream & is, CStudent & stu) { string inputStr; is >> inputStr; int pos = inputStr.find(",", 0); // 查找首次出現逗號的位置 string tmpStr = inputStr.substr(0, pos); // 截取從0到pos位置的字符串 stu.id = atoi(tmpStr.c_str()); // atoi可以將char*類型的內容轉成int類型 int pos2 = inputStr.find(",", pos + 1); // 查找第二次出現逗號的位置 tmpStr = inputStr.substr(pos + 1, pos2 - pos -1); // 取出age的值 stu.age = atoi(tmpStr.c_str()); // atoi可以將char*類型的內容轉成int類型 tmpStr = inputStr.substr(pos2 + 1, inputStr.length() - pos2 - 1); // 取出name的值 stu.name = tmpStr; return is; } int main() { CStudent stu; // 將輸入的信息,初始化stu對象 cin << stu; // 輸出std對象的信息 cout >> stu; return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      C++ 流插入和流提取運算符的重載

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      輸入內容和輸出內容:

      // 輸入內容: 1,20,小林coding // 輸出內容: 1,20,小林coding

      1

      2

      3

      4

      5

      04 小結

      要想流插入 << 運算符和流提取 >> 運算符能針對自定義的對象,那么我們就需要重載針對該對象的 ostream 類的 << 運算符 和 istream 的 >> 運算符,并且只能重載成全局的函數,然后在 CStudent 類里需要把上面的兩個重載函數聲明成友元函數,使得兩個重載的函數可以訪問和賦值 CStudent 類里的私有成員函數。

      C++ 面向對象編程

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:項目管理的pdca
      下一篇:wps2019 文件打開沒有“編輯”這一項(wps2019電腦版)
      相關文章
      亚洲大成色www永久网站| 亚洲日韩国产精品乱-久| 亚洲爆乳无码专区www| 亚洲国产日韩在线人成下载| 亚洲精品线在线观看| 亚洲av无码一区二区乱子伦as | 国产成人亚洲精品| 亚洲不卡在线观看| 亚洲av无码一区二区三区天堂古代| 久久久婷婷五月亚洲97号色| 亚洲黄色免费观看| 亚洲性色高清完整版在线观看| 亚洲国产精品午夜电影| 91亚洲精品麻豆| 亚洲天堂2016| 91麻豆精品国产自产在线观看亚洲| 亚洲国产精品毛片av不卡在线 | 在线观看国产一区亚洲bd| 在线精品自拍亚洲第一区| 亚洲AV无码专区在线厂| 日韩精品亚洲专区在线影视| 国产亚洲午夜精品| 久久综合亚洲色HEZYO国产| 亚洲一区二区三区无码中文字幕| 亚洲精品~无码抽插| 亚洲a一级免费视频| 亚洲色图综合网站| 亚洲性一级理论片在线观看| 亚洲永久在线观看| 亚洲av日韩av永久在线观看| 四虎精品亚洲一区二区三区 | 亚洲国产电影在线观看| 亚洲色成人四虎在线观看| 亚洲国产精品成人午夜在线观看| 国产精品亚洲а∨天堂2021| 亚洲日本中文字幕一区二区三区| 亚洲码国产精品高潮在线| 亚洲最新永久在线观看| 亚洲六月丁香婷婷综合| 久久精品国产亚洲AV未满十八| 亚洲第一页综合图片自拍|