基于Eclipse的高效C++開發(fā)平臺(tái)教程_第1頁(yè)
基于Eclipse的高效C++開發(fā)平臺(tái)教程_第2頁(yè)
基于Eclipse的高效C++開發(fā)平臺(tái)教程_第3頁(yè)
基于Eclipse的高效C++開發(fā)平臺(tái)教程_第4頁(yè)
基于Eclipse的高效C++開發(fā)平臺(tái)教程_第5頁(yè)
已閱讀5頁(yè),還剩169頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、挑戰(zhàn)30天C/C+ 入門極限系列教程使用Eclipse3.01 + MinGW3.1配置標(biāo)準(zhǔn)C/C+開發(fā)環(huán)境詳解/school 2005-04-15 10:38:25 來源: 網(wǎng)易學(xué)院前言學(xué)習(xí)c語(yǔ)言和c+的人首先需要的是一個(gè)可提供練習(xí)的開發(fā)平臺(tái),對(duì)于c+來說,可供使用的工具平臺(tái)有很多,包括Borland 的 c+ builder 和 Microsoft 的 Visual Studio 系列,的確他們都是非常不錯(cuò)的。 難道我們除了這些我們說熟悉的開發(fā)工具就沒有的選擇了? 對(duì)于我們此文的主角,Eclipse來說,很多人都知道它是為JAVA開發(fā)而生的,但今天我們要說的是如何利用它與MinGW配合,設(shè)

2、置出高效的c+開發(fā)平臺(tái)。 軟件準(zhǔn)備.Eclipse 3.06官方站點(diǎn): .C/C+ Development Toolkit注意,在這里我們選擇的是cdt-2.1.0-win32.x86 .MinGW 3.1系統(tǒng)環(huán)境 WIN2000/WINXP/WIN2003 環(huán)境配置我們把需要的工具都下載完畢后,首先安裝MinGW,安裝完畢后我們先配置一下系統(tǒng)的環(huán)境變量。 點(diǎn)擊我的電腦的屬性-高級(jí)-環(huán)境變量-系統(tǒng)變量-path 在path后增加:MinGW安裝路徑MinGWbin;,如下圖所示。接下來找到你安裝MinGW的目錄,將MinGWbinmingw32-make.exe這個(gè)文件,改名為make.exe

3、。接下來,我們安裝Eclipse。 在安裝完成后先不急運(yùn)行Eclipse,將下載的C/C+ Development Toolkit解壓后的features、plugins目錄放到Eclipse的安裝目錄下。 至此平臺(tái)配置基本完成,下面我們運(yùn)行Eclipse,第一次運(yùn)行的時(shí)候系統(tǒng)會(huì)提示用戶設(shè)置工作目錄既workspace,這也就是工程文件的安放位置,這里我們選擇默認(rèn)識(shí),運(yùn)行后的Eclipse環(huán)境界面如下圖。 使用Eclipse3.01 + MinGW3.1配置標(biāo)準(zhǔn)C/C+開發(fā)環(huán)境詳解/school 2005-04-15 10:38:25 來源: 網(wǎng)易學(xué)院下面我們來建一個(gè)工程 選擇FILE-NEW

4、-Project. 在彈出的對(duì)話框中選擇Standard Make C+ Progject,如下圖所示。之后選擇NEXT輸入工程文件名,這里我們輸入test,完成工程設(shè)置。 使用Eclipse3.01 + MinGW3.1配置標(biāo)準(zhǔn)C/C+開發(fā)環(huán)境詳解/school 2005-04-15 10:38:25 來源: 網(wǎng)易學(xué)院接下來我們展開左邊的Navigator對(duì)話框的test工程目錄,在空白處點(diǎn)擊Mouse右鍵,選擇NEW-FILE,如下圖所示。 接下來,在彈出的對(duì)話框中輸入要新添加的c+文件名,這里我們輸入Hello.cpp。 使用Eclipse3.01 + MinGW3.1配置標(biāo)準(zhǔn)C/C+開

5、發(fā)環(huán)境詳解/school 2005-04-15 10:38:25 來源: 網(wǎng)易學(xué)院接下來我們?cè)诰庉媽?duì)話框中輸入c+源程序,代碼如下: C+ 代碼 #include usingnamespacestd; intmain() coutShow View-Make Targets 在右邊出現(xiàn)的Make Targets對(duì)話框中選擇test工程名,Mouse右鍵盤選擇Add Make Targets,在接下來彈出的對(duì)話框中輸入 Target Name:MAKE FILE Builder Command:g+ Hello.cpp -g -o run,這里如果是c環(huán)境就改成gcc Hello.c -g -o

6、 run 完成后點(diǎn)擊Create。 如下圖所示: 完成后,點(diǎn)擊Make Targets對(duì)話框中的MAKE FILE分支就可以進(jìn)行源文件的編譯工作了,編譯完成后在Navigator對(duì)話框中會(huì)出現(xiàn)RUN.EXE,這就是編譯后的可執(zhí)行文件,雙擊就可以運(yùn)行它,如下圖所示意。 到此Eclipse+MinGW的標(biāo)準(zhǔn)c/c+環(huán)境就已經(jīng)全部配置并測(cè)試完畢,讀者如果還有問題可訪問,在討論區(qū)提問,我會(huì)給予解答。到這里,管寧的30天極限入門教程就全部連載完了。真心希望這篇教程能給初學(xué)者帶來一定的幫助。如果您覺得這套系列教程好,請(qǐng)您向您的朋友推薦;接下來,網(wǎng)易學(xué)院會(huì)獨(dú)家連載管寧原創(chuàng)的JAVA系列教程,請(qǐng)關(guān)注。 C+的

7、iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院我們從一開始就一直在利用C+的輸入輸出在做著各種練習(xí),輸入輸出是由iostream庫(kù)提供的,所以討論此標(biāo)準(zhǔn)庫(kù)是有必要的,它與C語(yǔ)言的stdio庫(kù)不同,它從一開始就是用多重繼承與虛擬繼承實(shí)現(xiàn)的面向?qū)ο蟮膶哟谓Y(jié)構(gòu),作為一個(gè)c+的標(biāo)準(zhǔn)庫(kù)組件提供給程序員使用。 iostream為內(nèi)置類型類型對(duì)象提供了輸入輸出支持,同時(shí)也支持文件的輸入輸出,類的設(shè)計(jì)者可以通過對(duì)iostream庫(kù)的擴(kuò)展,來支持自定義類型的輸入輸出操作。 為什么說要擴(kuò)展才能提供支持呢?我們來一個(gè)示例。 C+ 代碼

8、#include #include using namespace std; class Test public: Test(int a=0,int b=0) Test:a=a; Test:b=b; int a; int b; ; int main() Test t(100,50); printf(%?,t);/不明確的輸出格式 scanf(%?,t);/不明確的輸入格式 coutTt;/同樣不夠明確 system(pause); 由于自定義類的特殊性,在上面的代碼中,無論你使用c風(fēng)格的輸入輸出,或者是c+的輸入輸出都不是不明確的一個(gè)表示,由于c語(yǔ)言沒有運(yùn)算符重載機(jī)制,導(dǎo)致stdio庫(kù)的不可擴(kuò)

9、充性,讓我們無法讓printf()和scanf()支持對(duì)自定義類對(duì)象的擴(kuò)充識(shí)別,而c+是可以通過運(yùn)算符重載機(jī)制擴(kuò)充iostream庫(kù)的,使系統(tǒng)能能夠識(shí)別自定義類型,從而讓輸入輸出明確的知道他們?cè)摳墒裁?,格式是什么?在上例中我們之所以用printf與cout進(jìn)行對(duì)比目的是為了告訴大家,C與C+處理輸入輸出的根本不同,我們從c遠(yuǎn)的輸入輸出可以很明顯看出是函數(shù)調(diào)用方式,而c+的則是對(duì)象模式,cout和cin是ostream類和istream類的對(duì)象。 C+中的iostream庫(kù)主要包含下圖所示的幾個(gè)頭文件:我們所熟悉的輸入輸出操作分別是由istream(輸入流)和ostream(輸出流)這兩個(gè)類提

10、供的,為了允許雙向的輸入輸出,由istream和ostream派生出了iostream類。 類的繼承關(guān)系見下圖:C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院iostream庫(kù)定義了以下三個(gè)標(biāo)準(zhǔn)流對(duì)象:.cin,表示標(biāo)準(zhǔn)輸入(standard input)的istream類對(duì)象。cin使我們可以從設(shè)備讀如數(shù)據(jù)。 .cout,表示標(biāo)準(zhǔn)輸出(standard output)的ostream類對(duì)象。cout使我們可以向設(shè)備輸出或者寫數(shù)據(jù)。 .cerr,表示標(biāo)準(zhǔn)錯(cuò)誤(standard error)的osttream類

11、對(duì)象。cerr是導(dǎo)出程序錯(cuò)誤消息的地方,它只能允許向屏幕設(shè)備寫數(shù)據(jù)。 輸出主要由重載的左移操作符()完成。 a表示將數(shù)據(jù)放入a對(duì)象中。 這些標(biāo)準(zhǔn)的流對(duì)象都有默認(rèn)的所對(duì)應(yīng)的設(shè)備,見下表: 圖中的意思表明cin對(duì)象的默認(rèn)輸入設(shè)備是鍵盤,cout對(duì)象的默認(rèn)輸出設(shè)備是顯示器屏幕。 那么原理上+有是如何利用cincout對(duì)象與左移和右移運(yùn)算符重載來實(shí)現(xiàn)輸入輸出的呢? 下面我們以輸出為例,說明其實(shí)現(xiàn)原理: cout是ostream類的對(duì)象,因?yàn)樗赶虻氖菢?biāo)準(zhǔn)設(shè)備(顯示器屏幕),所以它在iostream頭文件中作為全局對(duì)象進(jìn)行定義。 ostream cout(stdout);/其默認(rèn)指向的C中的標(biāo)準(zhǔn)設(shè)備名

12、,作為其構(gòu)造函數(shù)的參數(shù)使用。 在iostream.h頭文件中,ostream類對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型都有其友元函數(shù)對(duì)左移操作符進(jìn)行了友元函數(shù)的重載。 ostream& operator(ostream &temp,int source); ostream& operator(ostream &temp,char *ps); 。等等 一句輸出語(yǔ)句:cout;,事實(shí)上調(diào)用的就是ostream& operator(ostream &temp,char *ps);這個(gè)運(yùn)算符重載函數(shù),由于返回的是流對(duì)象的引用,引用可以作為左值使用,所以當(dāng)程序中有類似cout中國(guó)軟件開發(fā)實(shí)驗(yàn)室;這樣的語(yǔ)句出現(xiàn)的時(shí)候,就能夠

13、構(gòu)成連續(xù)輸出。C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院由于iostream庫(kù)不光支持對(duì)象的輸入輸出,同時(shí)也支持文件流的輸入輸出,所以在詳細(xì)講解左移與右移運(yùn)算符重載只前,我們有必要先對(duì)文件的輸入輸出以及輸入輸出的控制符有所了解。 和文件有關(guān)系的輸入輸出類主要在fstream.h這個(gè)頭文件中被定義,在這個(gè)頭文件中主要被定義了三個(gè)類,由這三個(gè)類控制對(duì)文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來,他們之間的繼承關(guān)系見下圖

14、所示。 由于文件設(shè)備并不像顯示器屏幕與鍵盤那樣是標(biāo)準(zhǔn)默認(rèn)設(shè)備,所以它在fstream.h頭文件中是沒有像cout那樣預(yù)先定義的全局對(duì)象,所以我們必須自己定義一個(gè)該類的對(duì)象,我們要以文件作為設(shè)備向文件輸出信息(也就是向文件寫數(shù)據(jù)),那么就應(yīng)該使用ofstream類。 ofstream類的默認(rèn)構(gòu)造函數(shù)原形為: ofstream:ofstream(const char *filename,int mode = ios:out,int openprot = filebuf:openprot); filename:要打開的文件名 mode:要打開文件的方式 prot:打開文件的屬性 其中mode和ope

15、nprot這兩個(gè)參數(shù)的可選項(xiàng)表見下表: mode屬性表ios:app:以追加的方式打開文件 ios:ate:文件打開后定位到文件尾,ios:app就包含有此屬性 ios:binary: 以二進(jìn)制方式打開文件,缺省的方式是文本方式。兩種方式的區(qū)別見前文 ios:in: 文件以輸入方式打開 ios:out:文件以輸出方式打開 ios:trunc:如果文件存在,把文件長(zhǎng)度設(shè)為0 可以用“或”把以上屬性連接起來,如ios:out|ios:binary。 openprot屬性表:0:普通文件,打開訪問 1:只讀文件 2:隱含文件 4:系統(tǒng)文件 可以用“或”或者“+”把以上屬性連接起來 ,如3或1|2就是

16、以只讀和隱含屬性打開文件。 示例代碼如下: C+ 代碼 #include using namespace std; int main() ofstream myfile(c:1.txt,ios:out|ios:trunc,0); myfile中國(guó)軟件開發(fā)實(shí)驗(yàn)室ENDL網(wǎng)址:WWW.CNDEV-LAB.COM; myfile.close() system(pause); 文件使用完后可以使用close成員函數(shù)關(guān)閉文件。 ios:app為追加模式,在使用追加模式的時(shí)候同時(shí)進(jìn)行文件狀態(tài)的判斷是一個(gè)比較好的習(xí)慣。 示例如下: C+ 代碼 #include #include using namespac

17、e std; int main() ofstream myfile(c:1.txt,ios:app,0); if(!myfile)/或者寫成myfile.fail() cout文件打開失敗,目標(biāo)文件狀態(tài)可能為只讀!; system(pause); exit(1); myfile中國(guó)軟件開發(fā)實(shí)驗(yàn)室ENDL網(wǎng)址:WWW.CNDEV-LAB.COMmyfile.close(); 在定義ifstream和ofstream類對(duì)象的時(shí)候,我們也可以不指定文件。以后可以通過成員函數(shù)open()顯式的把一個(gè)文件連接到一個(gè)類對(duì)象上。 例如: C+ 代碼 #include #include using names

18、pace std; int main() ofstream myfile; myfile.open(c:1.txt,ios:out|ios:app,0); if(!myfile)/或者寫成myfile.fail() cout文件創(chuàng)建失敗,磁盤不可寫或者文件為只讀!; system(pause); exit(1); myfile中國(guó)軟件開發(fā)實(shí)驗(yàn)室ENDL網(wǎng)址:WWW.CNDEV-LAB.COMmyfile.close(); C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院下面我們來看一下是如何利用ifstream

19、類對(duì)象,將文件中的數(shù)據(jù)讀取出來,然后再輸出到標(biāo)準(zhǔn)設(shè)備中的例子。 代碼如下: C+ 代碼 #include #include #include using namespace std; int main() ifstream myfile; myfile.open(c:1.txt,ios:in,0); if(!myfile) cout文件讀錯(cuò)誤; system(pause); exit(1); char ch; string content; while(myfile.get(ch) content+=ch; cout.put(ch);/cout myfile.close(); coutsyst

20、em(pause); 上例中,我們利用成員函數(shù)get(),逐一的讀取文件中的有效字符,再利用put()成員函數(shù),將文件中的數(shù)據(jù)通過循環(huán)逐一輸出到標(biāo)準(zhǔn)設(shè)備(屏幕)上,get()成員函數(shù)會(huì)在文件讀到默尾的時(shí)候返回假值,所以我們可以利用它的這個(gè)特性作為while循環(huán)的終止條件,我們同時(shí)也在上例中引入了C+風(fēng)格的字符串類型string,在循環(huán)讀取的時(shí)候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。 C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院 我們?cè)诤?jiǎn)單介紹過ofstream

21、類和ifstream類后,我們?cè)賮砜匆幌耭stream類,fstream類是由iostream派生而來,fstream類對(duì)象可以同對(duì)文件進(jìn)行讀寫操作。 C+ 代碼 示例代碼如下: #include #include using namespace std; int main() fstream myfile; myfile.open(c:1.txt,ios:out|ios:app,0); if(!myfile) cout文件寫錯(cuò)誤,文件屬性可能為只讀!system(pause); exit(1); myfile中國(guó)軟件開發(fā)實(shí)驗(yàn)室ENDL網(wǎng)址:WWW.CNDEV-LAB.COMmyfile.cl

22、ose(); myfile.open(c:1.txt,ios:in,0); if(!myfile) cout文件讀錯(cuò)誤,文件可能丟失!system(pause); exit(1); char ch; while(myfile.get(ch) cout.put(ch); myfile.close(); system(pause); 由于fstream類可以對(duì)文件同時(shí)進(jìn)行讀寫操作,所以對(duì)它的對(duì)象進(jìn)行初始話的時(shí)候一定要顯式的指定mode和openprot參數(shù)。 C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院接下來我

23、們來學(xué)習(xí)一下串流類的基礎(chǔ)知識(shí),什么叫串流類? 簡(jiǎn)單的理解就是能夠控制字符串類型對(duì)象進(jìn)行輸入輸出的類,C+不光可以支持C+風(fēng)格的字符串流控制,還可以支持C風(fēng)格的字符串流控制。 我們先看看看C+是如何對(duì)C風(fēng)格的字符串流進(jìn)行控制的,C中的字符串其實(shí)也就是字符數(shù)組,字符數(shù)組內(nèi)的數(shù)據(jù)在內(nèi)存中的位置的排列是連續(xù)的,我們通常用char strsize或者char *str的方式聲明創(chuàng)建C風(fēng)格字符數(shù)組,為了能讓字符數(shù)組作為設(shè)備并提供輸入輸出操作,C+引入了ostrstream、istrstream、strstream這三個(gè)類,要使用他們創(chuàng)建對(duì)象就必須包含strstream.h頭文件。 istrstream類用

24、于執(zhí)行C風(fēng)格的串流的輸入操作,也就是以字符串?dāng)?shù)組作為輸入設(shè)備。 ostrstream類用于執(zhí)行C風(fēng)格的串流的輸出操作,也就是一字符串?dāng)?shù)組作為輸出設(shè)備。 strstream類同時(shí)可以支持C風(fēng)格的串流的輸入輸出操作。 istrstream類是從istream(輸入流類)和strstreambase(字符串流基類)派生而來,ostrstream是從ostream(輸出流類)和strstreambase(字符串流基類)派生而來,strstream則是從iostream(輸入輸出流類)和和strstreambase(字符串流基類)派生而來。 他們的繼承關(guān)系如下圖所示: 串流同樣不是標(biāo)準(zhǔn)設(shè)備,不會(huì)有預(yù)先定

25、義好的全局對(duì)象,所以不能直接操作,需要通過構(gòu)造函數(shù)創(chuàng)建對(duì)象。 類istrstream的構(gòu)造函數(shù)原形如下:istrstream:istrstream(const char *str,int size); 參數(shù)1表示字符串?dāng)?shù)組,而參數(shù)2表示數(shù)組大小,當(dāng)size為0時(shí),表示istrstream類對(duì)象直接連接到由str所指向的內(nèi)存空間并以0結(jié)尾的字符串。 下面的示例代碼就是利用istrstream類創(chuàng)建類對(duì)象,制定流輸入設(shè)備為字符串?dāng)?shù)組,通過它向一個(gè)字符型對(duì)象輸入數(shù)據(jù)。 代碼如下: C+ 代碼 #include #include using namespace std; int main() char

26、 *name = ; int arraysize = strlen(name)+1; istrstream is(name,arraysize); char temp; istemp; coutsystem(pause); 類ostrstream用于執(zhí)行C風(fēng)格的串流的輸出,它的構(gòu)造函數(shù)如下所示: ostrstream:ostrstream(char *_Ptr,int streamsize,int Mode = ios:out); 第一個(gè)參數(shù)是字符數(shù)組,第二個(gè)是說明數(shù)組的大小,第三個(gè)參數(shù)是指打開方式。 我們來一個(gè)示例代碼: C+ 代碼 #include #include using names

27、pace std; int main() int arraysize = 1; char *pbuffer = new chararraysize; ostrstream ostr(pbuffer,arraysize,ios:out); ostrARRAYSIZEENDS;/使用ostrstream輸出到流對(duì)象的時(shí)候,要用ends結(jié)束字符串 coutdelete pbuffer; system(pause); 上面的代碼中,我們創(chuàng)建一個(gè)c風(fēng)格的串流輸出對(duì)象ostr,我們將arraysize內(nèi)的數(shù)據(jù)成功的以字符串的形式輸出到了ostr對(duì)象所指向的pbuffer指針的堆空間中,pbuffer也正是

28、我們要輸出的字符串?dāng)?shù)組,在結(jié)尾要使用ends結(jié)束字符串,如果不這么做就有溢出的危險(xiǎn)。 C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院接下來我們繼續(xù)看一下C+風(fēng)格的串流控制,C+引入了ostringstream、istringstream、stringstream這三個(gè)類,要使用他們創(chuàng)建對(duì)象就必須包含sstream.h頭文件。 istringstream類用于執(zhí)行C+風(fēng)格的串流的輸入操作。 ostringstream類用于執(zhí)行C+風(fēng)格的串流的輸出操作。 stringstream類同時(shí)可以支持C+風(fēng)格的串流的輸入

29、輸出操作。 istringstream類是從istream(輸入流類)和stringstreambase(c+字符串流基類)派生而來,ostringstream是從ostream(輸出流類)和stringstreambase(c+字符串流基類)派生而來,stringstream則是從iostream(輸入輸出流類)和和stringstreambase(c+字符串流基類)派生而來。 他們的繼承關(guān)系如下圖所示: istringstream是由一個(gè)string對(duì)象構(gòu)造而來,istringstream類從一個(gè)string對(duì)象讀取字符。 istringstream的構(gòu)造函數(shù)原形如下: istringst

30、ream:istringstream(string str); 示例代碼如下: C+ 代碼 #include #include using namespace std; int main() istringstream istr; istr.str(1 56.7,); /上述兩個(gè)過程可以簡(jiǎn)單寫成 istringstream istr(1 56.7); cout istr.str()a; coutAb; coutBsystem(pause); 上例中,構(gòu)造字符串流的時(shí)候,空格會(huì)成為字符串參數(shù)的內(nèi)部分界,例子中對(duì)a,b對(duì)象的輸入賦值操作證明了這一點(diǎn),字符串的空格成為了整型數(shù)據(jù)與浮點(diǎn)型數(shù)據(jù)的分解點(diǎn),

31、利用分界獲取的方法我們事實(shí)上完成了字符串到整型對(duì)象與浮點(diǎn)型對(duì)象的拆分轉(zhuǎn)換過程。 str()成員函數(shù)的使用可以讓istringstream對(duì)象返回一個(gè)string字符串(例如本例中的輸出操作(coutostringstream同樣是由一個(gè)string對(duì)象構(gòu)造而來,ostringstream類向一個(gè)string插入字符。 ostringstream的構(gòu)造函數(shù)原形如下: ostringstream:ostringstream(string str); 示例代碼如下: C+ 代碼 #include #include #include using namespace std; int main() os

32、tringstream ostr; /ostr.str(abc);/如果構(gòu)造的時(shí)候設(shè)置了字符串參數(shù),那么增長(zhǎng)操作的時(shí)候不會(huì)從結(jié)尾開始增加,而是修改原有數(shù)據(jù),超出的部分增長(zhǎng) ostr.put(d); ostr.put(e); ostrfg; string gstr = ostr.str(); coutsystem(pause); 在上例代碼中,我們通過put()或者左移操作符可以不斷向ostr插入單個(gè)字符或者是字符串,通過str()函數(shù)返回增長(zhǎng)過后的完整字符串?dāng)?shù)據(jù),但值得注意的一點(diǎn)是,當(dāng)構(gòu)造的時(shí)候?qū)ο髢?nèi)已經(jīng)存在字符串?dāng)?shù)據(jù)的時(shí)候,那么增長(zhǎng)操作的時(shí)候不會(huì)從結(jié)尾開始增加,而是修改原有數(shù)據(jù),超出的部分增

33、長(zhǎng)。對(duì)于stringstream了來說,不用我多說,大家也已經(jīng)知道它是用于C+風(fēng)格的字符串的輸入輸出的。 stringstream的構(gòu)造函數(shù)原形如下: stringstream:stringstream(string str); C+ 代碼 示例代碼如下: #include #include #include using namespace std; int main() stringstream ostr(ccc); ostr.put(d); ostr.put(e); ostrfg; string gstr = ostr.str(); coutGSTRa; coutsystem(pause)

34、; 除此而外,stringstream類的對(duì)象我們還常用它進(jìn)行string與各種內(nèi)置類型數(shù)據(jù)之間的轉(zhuǎn)換。 示例代碼如下: C+ 代碼 #include #include #include using namespace std; int main() stringstream sstr; /-int轉(zhuǎn)string- int a=100; string str; sstrstr; coutSTR/-string轉(zhuǎn)char- sstr.clear();/如果你想通過使用同一stringstream對(duì)象實(shí)現(xiàn)多種類型的轉(zhuǎn)換,請(qǐng)注意在每一次轉(zhuǎn)換之后都必須調(diào)用clear()成員函數(shù)。 string nam

35、e = colinguan; char cname200; sstrcname; coutsystem(pause); C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院接下來我們來學(xué)習(xí)一下輸入/輸出的狀態(tài)標(biāo)志的相關(guān)知識(shí),C+中負(fù)責(zé)的輸入/輸出的系統(tǒng)包括了關(guān)于每一個(gè)輸入/輸出操作的結(jié)果的記錄信息。這些當(dāng)前的狀態(tài)信息被包含在io_state類型的對(duì)象中。io_state是一個(gè)枚舉類型(就像open_mode一樣),以下便是它包含的值。 goodbit 無錯(cuò)誤 Eofbit 已到達(dá)文件尾 failbit 非致命的輸入

36、/輸出錯(cuò)誤,可挽回 badbit致命的輸入/輸出錯(cuò)誤,無法挽回 有兩種方法可以獲得輸入/輸出的狀態(tài)信息。一種方法是通過調(diào)用rdstate()函數(shù),它將返回當(dāng)前狀態(tài)的錯(cuò)誤標(biāo)記。例如,假如沒有任何錯(cuò)誤,則rdstate()會(huì)返回goodbit. 下例示例,表示出了rdstate()的用法: C+ 代碼 #include using namespace std; int main() int a; cina; coutcin.rdstate()if(cin.rdstate() = ios:goodbit) cout輸入數(shù)據(jù)的類型正確,無錯(cuò)誤! if(cin.rdstate() = ios_base:

37、failbit) cout輸入數(shù)據(jù)類型錯(cuò)誤,非致命錯(cuò)誤,可清除輸入緩沖區(qū)挽回! system(pause); 另一種方法則是使用下面任何一個(gè)函數(shù)來檢測(cè)相應(yīng)的輸入/輸出狀態(tài): bool bad(); bool eof(); bool fail(); bool good(); 下例示例,表示出了上面各成員函數(shù)的用法: C+ 代碼 #include using namespace std; int main() int a; cina; coutcin.rdstate()if(cin.good() cout輸入數(shù)據(jù)的類型正確,無錯(cuò)誤! if(cin.fail() cout輸入數(shù)據(jù)類型錯(cuò)誤,非致命錯(cuò)誤

38、,可清除輸入緩沖區(qū)挽回! system(pause); C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院如果錯(cuò)誤發(fā)生,那么流狀態(tài)既被標(biāo)記為錯(cuò)誤,你必須清除這些錯(cuò)誤狀態(tài),以使你的程序能正確適當(dāng)?shù)乩^續(xù)運(yùn)行。要清除錯(cuò)誤狀態(tài),需使用clear()函數(shù)。此函數(shù)帶一個(gè)參數(shù),它是你將要設(shè)為當(dāng)前狀態(tài)的標(biāo)志值。,只要將ios:goodbit作為實(shí)參。 示例代碼如下: C+ 代碼 #include using namespace std; int main() int a; cina; coutcin.rdstate()cin.c

39、lear(ios:goodbit); coutcin.rdstate()system(pause); 通常當(dāng)我們發(fā)現(xiàn)輸入有錯(cuò)又需要改正的時(shí)候,使用clear()更改標(biāo)記為正確后,同時(shí)也需要使用get()成員函數(shù)清除輸入緩沖區(qū),以達(dá)到重復(fù)輸入的目的。 示例代碼如下: C+ 代碼 #include using namespace std; int main() int a; while(1) cina; if(!cin)/條件可改寫為cin.fail() cout輸入有錯(cuò)!請(qǐng)重新輸入cin.clear(); cin.get(); else coutbreak; system(pause); 最后再

40、給出一個(gè)對(duì)文件流錯(cuò)誤標(biāo)記處理的例子,鞏固學(xué)習(xí),代碼如下: C+ 代碼 #include #include using namespace std; int main() ifstream myfile(c:1.txt,ios_base:in,0); if(myfile.fail() cout文件讀取失敗或指定文件不存在! else char ch; while(myfile.get(ch) cout if(myfile.eof() cout文件內(nèi)容已經(jīng)全部讀完 while(myfile.get(ch) cout system(pause); C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算

41、符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院C語(yǔ)言提供了格式化輸入輸出的方法,C+也同樣,但是C+的控制符使用起來更為簡(jiǎn)單方便,在c+下有兩中方法控制格式化輸入輸出。 .有流對(duì)象的成員函數(shù)。 例如,下列程序以成員函數(shù)的方式控制輸出的精度: C+ 代碼 #include using namespace std; int main() float pi=3.14159f; coutPIcout.precision(2); coutPIsystem(pause); .使用C+輸入輸出控制符,控制符是在拖文件iomanip.h中定義的對(duì)象,與成員函數(shù)有一樣的效果,控

42、制符不必像成員函數(shù)學(xué)那樣單獨(dú)調(diào)用,它可以直接插入流中使用。 例如,下列程序以控制符的方式控制輸出的精度: C+ 代碼 #include #include using namespace std; int main() float pi=3.14159f; coutPIcoutcoutPIsystem(pause); 下表我們列出了一些比較常用的控制符號(hào),由于篇幅有限讀者請(qǐng)根據(jù)自己的需要查閱相關(guān)書籍:對(duì)于iostream標(biāo)準(zhǔn)庫(kù)來說包含了眾多的成員函數(shù),各函數(shù)都有其自身的作用,篇幅問題筆者在這里不能一一說明例舉,由于標(biāo)準(zhǔn)輸入對(duì)象cin提供輸入的時(shí)候會(huì)自動(dòng)以空格作為分界,給我們獲取一行帶有空格的完整

43、字符串帶來了困難,在這里補(bǔ)充一個(gè)非常用有的成員函數(shù)getline()。 其函數(shù)原型為: getlin(chiar *str,int size,char=n); 第一個(gè)參數(shù)是字符數(shù)組,用于存放整行文本,第二個(gè)參數(shù)讀取的最大字符個(gè)數(shù),第三個(gè)參數(shù)為作為分界界限的字符,默認(rèn)識(shí)是n,換行符。 示例代碼如下: C+ 代碼 #include #include using namespace std; int main() char str100; cin.getline(str,sizeof(str),n); coutSTRsystem(pause); C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符

44、的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院通過上面內(nèi)容的學(xué)習(xí),我們對(duì)i/o有了一些基本點(diǎn)基本的認(rèn)識(shí),現(xiàn)在是該切入正題的時(shí)候了,詳細(xì)學(xué)習(xí)一下,如何重載左移與右移操作符。 先說左移()操作符,也就是我們常說的輸出操作符。 對(duì)于自定義類來說,重載左移操作符的方法我們常使用類的友元方式進(jìn)行操作。 示例代碼如下: C+ 代碼 #include using namespace std; class Test public: Test(int age = 0,char *name = 0) Test:age = age; strcpy(Test:name,name); v

45、oid outmembers(ostream &out) outAge:AGEENDLNAME:name friend ostream& operator (ostream& ,Test&); protected: int age; char name50; ; ostream& operator (ostream& out,Test &temp) temp.outmembers(out); return out; int main() Test a(24,管寧); coutsystem(pause); 上例代碼中,我們對(duì)void outmembers(ostream &out)的參數(shù)使用os

46、tream定義主要是為了可以向它傳遞任何ostream類對(duì)象不光是cout也可以是ofstrem或者是ostrstream和ostringstream類對(duì)象,做到通用性。 重載運(yùn)算符,我們知道可以是非成員方式也可以是成員方式的,對(duì)于來說同樣也可以是成員方式,但我十分不推薦這么做,因?yàn)閷?duì)于類的成員函數(shù)來說,第一個(gè)參數(shù)始終是會(huì)被隱藏的,而且一定是當(dāng)前類類型的。 下面的示例代碼就是將上面的重載函數(shù)修改成成員方式的做法: C+ 代碼 #include using namespace std; class Test public: Test(int age = 0,char *name = 0) Tes

47、t:age = age; strcpy(Test:name,name); void outmembers(ostream &out) outAge:AGEENDLNAME:name ostream& operator outmembers(out); return out; protected: int age; char name50; ; int main() Test a(24,管寧); acout; system(pause); 從代碼實(shí)現(xiàn)上,我們將函數(shù)修改成了ostream& operator (ostream &out),迫不得已將ostream類型的引用參數(shù)放到了后面,這是因?yàn)椋?/p>

48、成員方式運(yùn)算符重載函數(shù)第一個(gè)參數(shù)會(huì)被隱藏,而且一定是當(dāng)前類類型的,這和ostream類型沖突了。由此我們?cè)谑褂胏out輸出的時(shí)候就必須寫成a為了鞏固學(xué)習(xí),下面我們以fstream對(duì)象輸出為例做一個(gè)練習(xí)。 代碼如下: C+ 代碼 #include #include using namespace std; class Test public: Test(int age = 0,char *name = 0) Test:age = age; strcpy(Test:name,name); void outmembers(ostream &out) outAge:AGEENDLNAME:name f

49、riend ostream& operator (ostream& ,Test&); protected: int age; char name50; ; ostream& operator (ostream& out,Test &temp) temp.outmembers(out); return out; int main() Test a(24,管寧); ofstream myfile(c:1.txt,ios:out,0); if (myfile.rdstate() = ios_base:goodbit) myfilecout文件創(chuàng)建成功,寫入正常! if (myfile.rdstate

50、() = ios_base:badbit) cout文件創(chuàng)建失敗,磁盤錯(cuò)誤! system(pause); C+的iostream標(biāo)準(zhǔn)庫(kù)介紹以及對(duì)左移與右移運(yùn)算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學(xué)院對(duì)于左移運(yùn)算符重載函數(shù)來說,由于不推薦使用成員方式,那么使用非成員方式在類有多重繼承的情況下,就不能使用虛函數(shù)進(jìn)行左移運(yùn)算符重載的區(qū)分,為了達(dá)到能夠區(qū)分顯示的目的,給每個(gè)類分別添加不同的虛函數(shù)是必要的。 示例代碼如下: C+ 代碼 #include #include using namespace std; class Student public: Stu

51、dent(int age = 0,char *name = 0) Student:age = age; strcpy(Student:name,name); virtual void outmembers(ostream &out) = 0; friend ostream& operator (ostream& ,Student&); protected: int age; char name50; ; ostream& operator (ostream& out,Student &temp) temp.outmembers(out); return out; class Academici

52、an:public Student public: Academician(int age = 0,char *name = 0,char *speciality=0):Student(age,name) strcpy(Academician:speciality,speciality); & C+運(yùn)算符重載賦值運(yùn)算符/school 2005-04-15 10:23:05 來源: 網(wǎng)易學(xué)院自定義類的賦值運(yùn)算符重載函數(shù)的作用與內(nèi)置賦值運(yùn)算符的作用類似,但是要要注意的是,它與拷貝構(gòu)造函數(shù)與析構(gòu)函數(shù)一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定默認(rèn)的賦值運(yùn)算符重載函數(shù),那么

53、系統(tǒng)將會(huì)自動(dòng)提供一個(gè)賦值運(yùn)算符重載函數(shù)。 賦值運(yùn)算符重載函數(shù)的定義與其它運(yùn)算符重載函數(shù)的定義是差不多的。 下面我們以實(shí)例說明如何使用它,代碼如下: C+ 代碼 #include usingnamespacestd; classInternet public: Internet(char*name,char*url) Internet:name=newcharstrlen(name)+1; Internet:url=newcharstrlen(url)+1; if(name) strcpy(Internet:name,name); if(url) strcpy(Internet:url,url)

54、; Internet(Internet&temp) Internet:name=newcharstrlen()+1; Internet:url=newcharstrlen(temp.url)+1; if(name) strcpy(Internet:name,); if(url) strcpy(Internet:url,temp.url); Internet() deletename; deleteurl; Internet&operator=(Internet&temp)/賦值運(yùn)算符重載函數(shù) deletethis-name; deletethis-url; this-name=newchars

55、trlen()+1; this-url=newcharstrlen(temp.url)+1; if(this-name) strcpy(this-name,); if(this-url) strcpy(this-url,temp.url); return*this; public: char*name; char*url; ; intmain() Interneta(中國(guó)軟件開發(fā)實(shí)驗(yàn)室,); Internetb=a;/b對(duì)象還不存在,所以調(diào)用拷貝構(gòu)造函數(shù),進(jìn)行構(gòu)造處理。 coutendlb.urlendl; Internetc(美國(guó)在線,); b=c;/b對(duì)象已經(jīng)存在,所以系統(tǒng)選擇賦值運(yùn)算符重

56、載函數(shù)處理。 coutendlb.urlendl; system(pause); 上例代碼中的Internet& operator =(Internet &temp)就是賦值運(yùn)算符重載函數(shù)的定義,內(nèi)部需要先delete的指針就是涉及深拷貝問題的地方,由于b對(duì)象已經(jīng)構(gòu)造過,name和url指針的范圍已經(jīng)確定,所以在復(fù)制新內(nèi)容進(jìn)去之前必須把堆區(qū)清除,區(qū)域的過大和過小都不好,所以跟在后面重新分配堆區(qū)大小,而后進(jìn)行復(fù)制工作。 在類對(duì)象還未存在的情況下,賦值過程是通過拷貝構(gòu)造函數(shù)進(jìn)行構(gòu)造處理(代碼中的Internet b = a;就是這種情況),但當(dāng)對(duì)象已經(jīng)存在,那么賦值過程就是通過賦值運(yùn)算符重載函數(shù)處

57、理(例子中的b = c;就屬于此種情況)。 C+運(yùn)算符重載轉(zhuǎn)換運(yùn)算符/school 2005-04-14 11:07:08 來源: 網(wǎng)易學(xué)院為什么需要轉(zhuǎn)換運(yùn)算符? 我們大家知道對(duì)于內(nèi)置類型的數(shù)據(jù)我們可以通過強(qiáng)制轉(zhuǎn)換符的使用來轉(zhuǎn)換數(shù)據(jù),例如(int)2.1f;自定義類也是類型,那么自定義類的對(duì)象在很多情況下也需要支持此操作,C+提供了轉(zhuǎn)換運(yùn)算符重載函數(shù),它使得自定義類對(duì)象的強(qiáng)轉(zhuǎn)換成為可能。 轉(zhuǎn)換運(yùn)算符的生命方式比較特別,方法如下: operator 類名(); 轉(zhuǎn)換運(yùn)算符的重載函數(shù)是沒有返回類型的,它和類的構(gòu)造函數(shù),析構(gòu)函數(shù)一樣是不遵循函數(shù)有返回類型的規(guī)定的,他們都沒有返回值。 下面我看一個(gè)例子

58、,看看它是如何工作的: C+ 代碼 /例 #include usingnamespacestd; classTest public: Test(inta=0) coutthis:載入構(gòu)造函數(shù)!aendl; Test:a=a; Test(Test&temp) cout載入拷貝構(gòu)造函數(shù)!endl; Test:a=temp.a; Test() coutthis:載入析構(gòu)函數(shù)!aendl; cin.get(); operatorint()/轉(zhuǎn)換運(yùn)算符 coutthis:載入轉(zhuǎn)換運(yùn)算符函數(shù)!aendl; returnTest:a; public: inta; ; intmain() Testb(99);

59、 coutb的內(nèi)存地址&bendl; cout(int)bendl;/強(qiáng)轉(zhuǎn)換 system(pause); 在例子中我們利用轉(zhuǎn)換運(yùn)算符將Test類的對(duì)象強(qiáng)轉(zhuǎn)換成了int類型并輸出,注意觀察轉(zhuǎn)換運(yùn)算符函數(shù)的運(yùn)行狀態(tài),發(fā)現(xiàn)并沒有產(chǎn)生臨時(shí)對(duì)象,證明了它與普通函數(shù)并不相同,雖然它帶有return語(yǔ)句。在很多情況下,類的強(qiáng)轉(zhuǎn)換運(yùn)算符還可以作為類對(duì)象加運(yùn)算重載函數(shù)使用,盡管他們的意義并不相同,下面的例子,就是利用轉(zhuǎn)換運(yùn)算符,將兩個(gè)類對(duì)象轉(zhuǎn)換成int后,相加并創(chuàng)建臨時(shí)類對(duì)象,后再賦給另一個(gè)對(duì)象。 代碼如下 C+ 代碼 /例 #include usingnamespacestd; classTest publ

60、ic: Test(inta=0) coutthis:載入構(gòu)造函數(shù)!aendl; Test:a=a; Test(Test&temp) cout載入拷貝構(gòu)造函數(shù)!endl; Test:a=temp.a; Test() coutthis:載入析構(gòu)函數(shù)!aendl; cin.get(); operatorint() coutthis:載入轉(zhuǎn)換運(yùn)算符函數(shù)的內(nèi)存地址:aendl; returnTest:a; public: inta; ; intmain() Testa(100),b(100),c; couta的內(nèi)存地址&a|b的內(nèi)存地址&bendl; c=Test(int)a+(int)b);/顯示式轉(zhuǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論