C 基礎教程物件導向(學習筆記(102))

2021-09-02 19:40:47 字數 2593 閱讀 7414

iostream庫相當複雜,因此我們無法在這些教程中完整地介紹它。但是,我們將向您展示最常用的功能。在本節中,我們將介紹輸​​入類(istream)的各個方面。

注意:本課程中的所有i / o功能都位於std命名空間中。這意味著所有i / o物件和函式都必須以「std ::」為字首,或者必須使用「using namespace std;」語句。

提取運算元

正如現在許多課程中所見,我們可以使用提取運算子(>>)從輸入流中讀取資訊。c ++為所有內建資料型別預定義了提取操作,您已經了解了如何為自己的類過載提取操作符。

讀取字串時,提取運算子的乙個常見問題是如何防止輸入溢位緩衝區。給出以下示例:

char buf[10];

cin >> buf;

如果使用者輸入18個字元會發生什麼?緩衝區溢位,發生了不好的事情。一般來說,對使用者將輸入多少個字元進行任何假設都是乙個壞主意。

解決這個問題的一種方法是使用操縱器。操縱器是用於當與提取(>>)或插入(<<)運算子應用於修改流的物件。你已經廣泛使用的乙個操縱器是「endl」,它既可以列印換行符,也可以重新整理任何緩衝輸出。c ++提供了乙個稱為setw的操作符(在iomanip.h標頭檔案中),可用於限制從流中讀入的字元數。要使用setw(),只需提供要作為引數讀取的最大字元數,然後將其插入到輸入語句中,如下所示:

#include char buf[10];

cin >> setw(10) >> buf;

此程式現在只讀取流中的前9個字元(為終結器留出空間)。任何剩餘的字元將保留在流中,直到下一次提取。

提取和空格

到目前為止我們忽略的一件事是提取操作符使用「格式化」資料,也就是說,它跳過空格(空格,製表符和換行符)。

看看以下程式:

int main()

當使用者輸入以下內容時:

hello my name is alex

提取運算子會跳過空格和換行符。因此,輸出是:

hellomynameisalex

通常情況下,您需要獲取使用者輸入但不要丟棄空白。為此,istream類提供了許多可用於此目的的函式。

其中最有用的是get()函式,它只是從輸入流中獲取乙個字元。這是與上面相同的程式使用get():

int main()

現在,當我們使用輸入時:

hello my name is alex

輸出是:

hello my name is alex

get()也有乙個字串版本,需要讀取最多字元數:

int main()

如果我們輸入:

hello my name is alex

輸出是:

hello my n

請注意,我們只讀取前10個字元(我們不得不為終結符留下乙個字元)。剩餘的字元留在輸入流中。

關於get()的乙個重要注意事項是它不會讀取換行符!這可能會導致一些意外結果:

int main()

如果使用者輸入:

hello!

該計畫將列印:

hello!

然後終止!為什麼不再要10個字元呢?答案是因為第乙個get()讀取到換行符然後停止。第二個get()看到cin流中仍有輸入並嘗試讀取它。但是第乙個字元是換行符,所以它立即停止了。

因此,還有乙個名為getline()的函式與get()完全相同,但也會讀取換行符。

int main()

即使使用者輸入帶有換行符的字串,此**也會按預期執行。

如果您需要知道上次呼叫getline()時提取了多少字元,請使用gcount():

int main()

std :: string的特殊版本的getline()

有乙個特殊版本的getline(),它位於istream類之外,用於讀取std :: string型別的變數。此特殊版本不是ostream或istream的成員,並且包含在字串標頭中。以下是其使用示例:

#include #include int main()

一些更有用的istream函式

您可能希望使用一些更有用的輸入函式:

ignore()丟棄流中的第乙個字元。

ignore(int ncount)丟棄第乙個ncount字元。

peek()允許您從流中讀取字元而不從流中刪除它。

unget()返回讀回流中的最後乙個字元,以便下次呼叫時再次讀取它。

putback(char ch)允許您將您選擇的字元放回流中,以便下次呼叫時讀取。

istream包含上述功能的許多其他功能和變體,可能很有用,具體取決於您需要做什麼。但是,這些主題更適合專注於標準庫的教程或書籍(例如nicolai m. josuttis 出色的「the c ++ standard library」)。

C 基礎教程物件導向(學習筆記5(2))

在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...

C 基礎教程物件導向(學習筆記(23))

過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...

C 基礎教程物件導向(學習筆記(24))

過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...