iostream是指iostream庫。iostream的意思是輸入輸出流,直接點說就是in(輸入) out(輸出) stream(流),取in、out的首字母與stream合成。
基本介紹
- 中文名:輸入輸出流
- 外文名:iostream
- 分別表示:輸入流和輸出流
- 定義:4 個 IO 對象
- 意思:輸入輸出流
- 合成:in、out的首字母與stream
組成,基本類模板,類模板實例,標準對象,類型,操縱符,C++語言,歷史,內容,
組成
iostream 庫的基礎是兩種命名為 istream 和 ostream 的類型,分別表示輸入流和輸出流。流是指要從某種 IO 設備上讀出或寫入的字元序列。術語“流”試圖說明字元是隨著時間順序生成或消耗的。
標準庫定義了 4 個 IO 對象。處理輸入時使用命名為 cin(讀作 see-in)的 istream 類型對象。這個對象也稱為標準輸入。處理輸出時使用命名為 cout(讀作 see-out)的 ostream 類型對象,這個對象也稱為標準輸出。標準庫還定義了另外兩個 ostream 對象,分別命名為 cerr 和 clog(分別讀作“see-err”和“see-log”)。cerr 對象又叫作標準錯誤,通常用來輸出警告和錯誤信息給程式的使用者。而 clog 對象用於產生程式執行的一般信息。
基本類模板
iostream(.h)庫的基礎是類模板的層級結構。類模板以一種與類型無關的方式,提供了這個庫的大部分功能。
基本類模板是一個類模板的集合,其中每個類模板有兩個參數:字元類型(charT)參數決定處理的元素類型,而特性參數 對每個特定的元素類型提供一些額外的特徵。
這個類層級結構中的類模板和它們的字元類型的實例相比,名字前面多了前綴basic_。例如,istream由之實例化而來的類模板名為basic_istream,fstream由之實例化而來的類模板名為basic_fstream,等等。唯一的例外是ios_base,因為它本身就是類型無關的,所以它並不基於任何類模板,而是一個正規類。
類模板實例
iostream(.h)庫中集成了兩組標準的整個iostream類模板層級結構的實例:一組是面向單位元組的,處理char類型的元素;另一組是面向寬位元組的,處理wchar_t類型的元素。
面向單位元組(char型)的實例可能是iostream(.h)庫更為人所知的一部分。 ios、istream和ofstream等類都是面向單位元組的。右圖是面向單位元組的所有類的名稱和關係。面向寬位元組(wchar_t型)的實例的命名規則與面向單位元組的實例相同,但所有類和對象名稱前有前綴w,例如wios、wistream和wofstream。
標準對象
作為iostream(.h)庫的一部分,頭檔案<iostream(.h)>聲明了一些用來在標準輸入輸出設備上進行輸入輸出操作的對象。
這些對象分為兩組:面向單位元組的,即常見的cin、cout、cerr和clog;其面向寬位元組的對應物,聲明為wcin、wcout、wcerr和wclog。
類型
iostream(.h)庫中的類很少對其成員的原型使用基本類型,而是通常使用根據其實例的特性定義的類型。對默認的char和wchar_t型的實例,類型streampos、streamoff和streamsize分別用以表示位置、偏移和大小。
操縱符
操縱符是用來與對流對象進行操作的插入(<<)和提取(>>)運算符一同使用的全局函式。它們通常變更流的屬性和格式設定。endl、hex和scientific是一些操縱符的例子。
C++語言
#include<iostream>是標準的C++頭檔案,任何符合標準的C++開發環境都有這個頭檔案。
在舊的標準C++中,使用#include<iostream.h>
但在新標準中,用#include<iostream>,而且在VC中編程的同時要注意要添加:
using namespace std;
在C++中,輸入輸出流被定義為類。C++的I/O庫中的類稱為流類(stream class)。用流類定義的對象稱為流對象。
歷史
很多學C++的都知道,C++中有一個iostream.h。這是C++早期版本所使用的,而現在版本已經不支持。現在版本用的是iostream。(#include "iostream")在C++的早期版本面世後,業界內普遍反映iostream.h速度慢,C++也在不斷地改進,而到某一版本,新寫出了一種輸入輸出流,此輸入輸出流速度較快,被業界普遍接受。C++標準為了凸顯C++與C的不同,以及C++對以往的進步,還有對C++早期語言的兼容,將此輸入輸出流命名為iostream,而同時也保留了iostream.h,這兩個檔案可以在Viual Studio編輯器中的外部依賴項看到。它們的代碼是不盡相同的。
using namespace std詳解
一 :
<iostream>和<iostream.h>是不一樣,前者沒有後綴,實際上,在你的編譯器include資料夾裡面可以看到,二者是兩個檔案,打開檔案就會發現,裡面的代碼是不一樣的。
後綴為.h的頭檔案c++標準已經明確提出不支持了,早些的實現將標準庫功能定義在全局空間裡,聲明在帶.h後綴的頭檔案里,c++標準為了和C區別開,也為了正確使用命名空間,規定頭檔案不使用後綴.h。
因此,當使用<iostream.h>時,相當於在c中調用庫函式,使用的是全局命名空間,也就是早期的c++實現;當使用<iostream>的時候,該頭檔案沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。
二:
所謂namespace,是指標識符的各種可見範圍。
由於namespace的概念,使用C++標準程式庫的任何標識符時,可以有三種選擇:
1、直接指定標識符。例如std::ostream而不是ostream。完整語句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using關鍵字。
using std::cout;
using std::endl;
以上程式可以寫成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std;
例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
cout << hex << 3.4 << endl;
在iostream檔案頭中定義的類有ios,istream,ostream,iostream,istream_withassign,ostream_withassign,iostream_withassign等。
因為標準庫非常的龐大,所以程式設計師在選擇的類的名稱或函式名時就很有可能和標準庫中的某個名字相同。所以為了避免這種情況所造成的名字衝突,就把標準庫中的一切都放在名字空間std中。但這又會帶來了一個新問題。無數原有的C++代碼都依賴於使用了多年的偽標準庫中的功能,他們都是在全局空間下的。
所以就有了<iostream.h>和<iostream>等等這樣的頭檔案,一個是為了兼容以前的C++代碼,一個是為了支持新的標準。
命名空間std封裝的是標準程式庫的名稱,標準程式庫為了和以前的頭檔案區別,一般不加".h" .
內容
// iostream standard header#if _MSC_VER > 1000#pragma once#endif#ifndef _IOSTREAM_#define _IOSTREAM_#include <istream>#ifdef _MSC_VER#pragma pack(push,8)#endif /* _MSC_VER */_STD_BEGIN // OBJECTSstatic ios_base::Init _Ios_init;extern _CRTIMP istream cin;extern _CRTIMP ostream cout;extern _CRTIMP ostream cerr, clog; // CLASS _Winitclass _CRTIMP _Winit {public: _Winit(); ~_Winit();private: static int _Init_cnt; }; // WIDE OBJECTSstatic _Winit _Wios_init;extern _CRTIMP wistream wcin;extern _CRTIMP wostream wcout, wcerr, wclog;_STD_END#ifdef _MSC_VER#pragma pack(pop)#endif /* _MSC_VER */#endif /* _IOSTREAM_ *//* * Copyright (c) 1994 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. */