色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++輸入和輸出的真實面目

Android編程精選 ? 來源:編程學習總站 ? 作者:代碼的牛頓 ? 2021-09-29 15:22 ? 次閱讀

C++輸入和輸出

在C++里std::cin、std::cout、std::cerr和std::endl分別是標準輸入、標準輸出、標準錯誤輸出和刷新緩沖區并換行,它們都在命名空間std中,那么它們真實面目是什么?我們先來看一段代碼:

#include 《iostream》 int main() { std::cout 《《 “Hello World!” 《《 std::endl; std::cerr 《《 “error” 《《 std::endl; return 0; }

這段代碼很簡單,就是輸出“Hello world!”和“error”,那么這段代碼的底層原理是?我們先來看一下std::cout在標準庫中的定義:

#ifndef _LIBCPP_HAS_NO_STDOUT extern _LIBCPP_FUNC_VIS ostream cout; extern _LIBCPP_FUNC_VIS wostream wcout; #endif 。。.。。. typedef basic_streambuf《char》 streambuf; typedef basic_istream《char》 istream; typedef basic_ostream《char》 ostream; typedef basic_iostream《char》 iostream;

。。.。。. template 《class _CharT, class _Traits》 class _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios《_CharT, _Traits》 { 。。.。。. };

從以上代碼我們可以看出std::cout是一個類basic_stream《char》的一個實例,那么很容易我們就能想到《《很有可能是類basic_stream《char》的一個成員函數,繼續追蹤下去,看看《《到底是啥。在類模板basic_stream中我們找到成員函數聲明如下:

basic_ostream& operator《《(bool __n); basic_ostream& operator《《(short __n);

basic_ostream& operator《《(unsigned short __n); basic_ostream& operator《《(int __n);

basic_ostream& operator《《(unsigned int __n); basic_ostream& operator《《(long __n);

basic_ostream& operator《《(unsigned long __n); basic_ostream& operator《《(long long __n);

basic_ostream& operator《《(unsigned long long __n); basic_ostream& operator《《(float __f);

basic_ostream& operator《《(double __f); basic_ostream& operator《《(long double __f); basic_ostream& operator《《(const void* __p); basic_ostream& operator《《(basic_streambuf《char_type, traits_type》* __sb);

充分證實了我們猜想,《《其實是成員函數operator《《并且返回值是basic_ostream&,到這里我們就可以看出std::cout 《《 “Hello World!”其實是basic_ostream實例變量cout調用成員函數operator《《輸出字符串“Hello World!”并返回basic_ostream&。

那么std::endl是不是某個類的實例呢?我們看看std::endl在標準庫的定義:

template 《class _CharT, class _Traits》 inline _LIBCPP_INLINE_VISIBILITY basic_ostream《_CharT, _Traits》& endl(basic_ostream《_CharT, _Traits》& __os) { __os.put(__os.widen(‘ ’)); __os.flush(); return __os; }

從代碼里可以看出,std::endl其實是一個函數模板,調用該函數會將一個換行符“ ”放入緩沖區,并刷新緩沖區,最后返回basic_ostream&。到這里我們終于明白std::cout 《《 “Hello World!” 《《 std::endl;的含義了,basic_ostream實例變量cout調用成員函數operator《《輸出字符串“Hello World!”,返回basic_ostream&并繼續調用成員函數operator《《輸出換行符并刷新輸出緩沖區。

現在我們很容易想到std::cerr和std::cout應該差不多,區別則是std::cerr是標準錯誤輸出,將信息輸出到標準錯誤流。std::cerr定義如下:

extern _LIBCPP_FUNC_VIS ostream cerr; extern _LIBCPP_FUNC_VIS wostream wcerr; extern _LIBCPP_FUNC_VIS ostream clog; extern _LIBCPP_FUNC_VIS wostream wclog;

最后我們看看std::cin到底是什么玩意,先來看下下面這段代碼:

#include 《iostream》 int main() { std::string name; std::cin 》》 name; return 0; }

代碼很簡單,就是想通過標準輸入輸入名字,并保存在變量name中。有了上面的經驗,我們很容易想到std::cin應該是某個類的實例變量,而》》則是類的成員函數。std::cin的定義如下:

#ifndef _LIBCPP_HAS_NO_STDIN extern _LIBCPP_FUNC_VIS istream cin; extern _LIBCPP_FUNC_VIS wistream wcin; #endif 。。.。。. typedef basic_streambuf《char》

streambuf; typedef basic_istream《char》 istream; typedef basic_ostream《char》 ostream; typedef basic_iostream《char》 iostream;

。。.。。. template 《class _CharT, class _Traits》 class _LIBCPP_TEMPLATE_VIS basic_istream : virtual public basic_ios《_CharT, _Traits》 { 。。.。。. };

從代碼中可以看出std::cin是類basic_istream《char》的實例變量,且basic_istream是類模板。下面我們看看》》在basic_istream中聲明:

basic_istream& operator》》(basic_streambuf《char_type, traits_type》* __sb);

basic_istream& operator》》(bool& __n); basic_istream& operator》》(short& __n);

basic_istream& operator》》(unsigned short& __n); basic_istream& operator》》(int& __n);

basic_istream& operator》》(unsigned int& __n); basic_istream& operator》》(long& __n);

basic_istream& operator》》(unsigned long& __n); basic_istream& operator》》(long long& __n);

basic_istream& operator》》(unsigned long long& __n); basic_istream& operator》》(float& __f);

basic_istream& operator》》(double& __f); basic_istream& operator》》(long double& __f);

basic_istream& operator》》(void*& __p);

不出我們所料》》確實是成員函數operator》》并返回basic_istream&,那么這段代碼std::cin》》name就很容易理解了,basic_istream《char》類實例變量cin調用成員函數operator》》從標準輸入輸入數據,并保存在變量name中。到這里std::cout、std::cin、std::cerr和std::endl的含義終于真相大白了!

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62571
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73619

原文標題:std::cin、std::cout、std::cerr和std::endl在C++里的真實面目

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++ 的函數,除了構造和析構這兩個特殊的函數,必須
    的頭像 發表于 11-29 10:25 ?271次閱讀

    C7000 C/C++優化指南用戶手冊

    電子發燒友網站提供《C7000 C/C++優化指南用戶手冊.pdf》資料免費下載
    發表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優化指南用戶手冊

    TMS320C6000優化C/C++編譯器v8.3.x

    電子發燒友網站提供《TMS320C6000優化C/C++編譯器v8.3.x.pdf》資料免費下載
    發表于 11-01 09:35 ?0次下載
    TMS320<b class='flag-5'>C</b>6000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v8.3.x

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?199次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    ostream在c++中的用法

    )是 C++ 標準輸出流體系的核心部分,用于向各種輸出設備(如控制臺、文件等)發送數據。 1. 基本概念 ostream 是一個抽象基類,它定義了向輸出流寫入數據的基本接口。 ost
    的頭像 發表于 09-20 15:11 ?663次閱讀

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優化與整理,已經是非常貼近開發的使用習慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發表于 07-26 09:20 ?876次閱讀

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    C++有多態與繼承,但是很多人開始學習C++,有時候會面臨一個常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有instanceof這個
    的頭像 發表于 07-18 10:16 ?574次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    如何用CubeMX產生C++專案?

    今天寫了一個類別,準備實驗的時候發現Cube沒辦法選擇輸出Cpp專案阿 我IDE是用ST出的Eclipse直接Import進來的,我也試過Convert to C++但沒有用阿。
    發表于 05-10 06:57

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C標準庫hypot接口計算兩個給定數平方和的平
    的頭像 發表于 04-14 11:43 ?2591次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?784次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    c語言,c++,java,python區別

    C語言、C++、Java和Python是四種常見的編程語言,各有優點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠對計算機硬件進行直接操作。
    的頭像 發表于 02-05 14:11 ?2361次閱讀

    vb語言和c++語言的區別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB語言和C++語言的區別。 設計目標: VB語言(Visual Basic)是由
    的頭像 發表于 02-01 10:20 ?2257次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?581次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 92电影网午夜福利| 亚洲 欧美 综合 高清 在线| 神马伦理2019影院不卡片| 国产激情视频在线| 欧美嫩freexxxhddvd| 中文字幕在线不卡日本v二区| a视频在线观看免费| 蜜芽一区二区国产精品| 双腿打开揉弄高潮H苏安安秦慕深 双腿被绑成M型调教PLAY照片 | 久久久亚洲国产精品主播| 国产成人综合在线视频| 日本老师xxxxx18| 成年妇女免费播放| 日韩精品 电影一区 亚洲高清| 亚洲精品123区在线观看| 国产免费网站看v片在线| 亚洲精品天堂在线观看| a在线免费观看视频| 欧美人与禽zoz0性伦交app| 啊…嗯啊好深男男高h文总受| 久久国产36精品色熟妇| 在线 自拍 综合 亚洲 欧美| 国产白丝精品爽爽久久蜜臀 | 深夜释放自己污在线看| 国产成人拍精品免费视频爱情岛 | beeg xxx日本老师| 日韩欧美视频一区二区| 2017天天拍天天拍香蕉视频| 一扒二脱三插片在线观看| 黑吊大战白xxxxxx| 中文中幕无码亚洲在线| 暖暖在线观看播放视频| 国产69精品9999XXXX| 内射白浆一区二区在线观看| 超碰97视频在线观看| 午夜伦理一yy4480影院| TIMI1TV天美传媒在线观看| 人人爽天天碰狠狠添| 国产亚洲精品A久久777777 | 男女啪啪抽搐呻吟高潮动态图| 亚洲欧美中文字幕5发布|