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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、置出高效的c+開發(fā)平臺。 軟件準備.Eclipse 3.06官方站點: .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)境變量。 點擊我的電腦的屬性-高級-環(huán)境變量-系統(tǒng)變量-path 在path后增加:MinGW安裝路徑MinGWbin;,如下圖所示。接下來找到你安裝MinGW的目錄,將MinGWbinmingw32-make.exe這個文件,改名為make.exe

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

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

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

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

7、iostream標準庫介紹以及對左移與右移運算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學院我們從一開始就一直在利用C+的輸入輸出在做著各種練習,輸入輸出是由iostream庫提供的,所以討論此標準庫是有必要的,它與C語言的stdio庫不同,它從一開始就是用多重繼承與虛擬繼承實現(xiàn)的面向對象的層次結構,作為一個c+的標準庫組件提供給程序員使用。 iostream為內置類型類型對象提供了輸入輸出支持,同時也支持文件的輸入輸出,類的設計者可以通過對iostream庫的擴展,來支持自定義類型的輸入輸出操作。 為什么說要擴展才能提供支持呢?我們來一個示例。 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風格的輸入輸出,或者是c+的輸入輸出都不是不明確的一個表示,由于c語言沒有運算符重載機制,導致stdio庫的不可擴

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

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

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

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

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

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

15、nprot這兩個參數(shù)的可選項表見下表: mode屬性表ios:app:以追加的方式打開文件 ios:ate:文件打開后定位到文件尾,ios:app就包含有此屬性 ios:binary: 以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區(qū)別見前文 ios:in: 文件以輸入方式打開 ios:out:文件以輸出方式打開 ios:trunc:如果文件存在,把文件長度設為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中國軟件開發(fā)實驗室ENDL網(wǎng)址:WWW.CNDEV-LAB.COM; myfile.close() system(pause); 文件使用完后可以使用close成員函數(shù)關閉文件。 ios:app為追加模式,在使用追加模式的時候同時進行文件狀態(tài)的判斷是一個比較好的習慣。 示例如下: C+ 代碼 #include #include using namespac

17、e std; int main() ofstream myfile(c:1.txt,ios:app,0); if(!myfile)/或者寫成myfile.fail() cout文件打開失敗,目標文件狀態(tài)可能為只讀!; system(pause); exit(1); myfile中國軟件開發(fā)實驗室ENDL網(wǎng)址:WWW.CNDEV-LAB.COMmyfile.close(); 在定義ifstream和ofstream類對象的時候,我們也可以不指定文件。以后可以通過成員函數(shù)open()顯式的把一個文件連接到一個類對象上。 例如: 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中國軟件開發(fā)實驗室ENDL網(wǎng)址:WWW.CNDEV-LAB.COMmyfile.close(); C+的iostream標準庫介紹以及對左移與右移運算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學院下面我們來看一下是如何利用ifstream

19、類對象,將文件中的數(shù)據(jù)讀取出來,然后再輸出到標準設備中的例子。 代碼如下: C+ 代碼 #include #include #include using namespace std; int main() ifstream myfile; myfile.open(c:1.txt,ios:in,0); if(!myfile) cout文件讀錯誤; 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)逐一輸出到標準設備(屏幕)上,get()成員函數(shù)會在文件讀到默尾的時候返回假值,所以我們可以利用它的這個特性作為while循環(huán)的終止條件,我們同時也在上例中引入了C+風格的字符串類型string,在循環(huán)讀取的時候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。 C+的iostream標準庫介紹以及對左移與右移運算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學院 我們在簡單介紹過ofstream

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

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

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

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

25、義好的全局對象,所以不能直接操作,需要通過構造函數(shù)創(chuàng)建對象。 類istrstream的構造函數(shù)原形如下:istrstream:istrstream(const char *str,int size); 參數(shù)1表示字符串數(shù)組,而參數(shù)2表示數(shù)組大小,當size為0時,表示istrstream類對象直接連接到由str所指向的內存空間并以0結尾的字符串。 下面的示例代碼就是利用istrstream類創(chuàng)建類對象,制定流輸入設備為字符串數(shù)組,通過它向一個字符型對象輸入數(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風格的串流的輸出,它的構造函數(shù)如下所示: ostrstream:ostrstream(char *_Ptr,int streamsize,int Mode = ios:out); 第一個參數(shù)是字符數(shù)組,第二個是說明數(shù)組的大小,第三個參數(shù)是指打開方式。 我們來一個示例代碼: 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輸出到流對象的時候,要用ends結束字符串 coutdelete pbuffer; system(pause); 上面的代碼中,我們創(chuàng)建一個c風格的串流輸出對象ostr,我們將arraysize內的數(shù)據(jù)成功的以字符串的形式輸出到了ostr對象所指向的pbuffer指針的堆空間中,pbuffer也正是

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

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

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

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

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

33、長。對于stringstream了來說,不用我多說,大家也已經(jīng)知道它是用于C+風格的字符串的輸入輸出的。 stringstream的構造函數(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類的對象我們還常用它進行string與各種內置類型數(shù)據(jù)之間的轉換。 示例代碼如下: C+ 代碼 #include #include #include using namespace std; int main() stringstream sstr; /-int轉string- int a=100; string str; sstrstr; coutSTR/-string轉char- sstr.clear();/如果你想通過使用同一stringstream對象實現(xiàn)多種類型的轉換,請注意在每一次轉換之后都必須調用clear()成員函數(shù)。 string nam

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

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

37、failbit) cout輸入數(shù)據(jù)類型錯誤,非致命錯誤,可清除輸入緩沖區(qū)挽回! system(pause); 另一種方法則是使用下面任何一個函數(shù)來檢測相應的輸入/輸出狀態(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ù)的類型正確,無錯誤! if(cin.fail() cout輸入數(shù)據(jù)類型錯誤,非致命錯誤

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

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

40、給出一個對文件流錯誤標記處理的例子,鞏固學習,代碼如下: 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文件內容已經(jīng)全部讀完 while(myfile.get(ch) cout system(pause); C+的iostream標準庫介紹以及對左移與右移運算

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

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

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

44、的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學院通過上面內容的學習,我們對i/o有了一些基本點基本的認識,現(xià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); 上例代碼中,我們對void outmembers(ostream &out)的參數(shù)使用os

46、tream定義主要是為了可以向它傳遞任何ostream類對象不光是cout也可以是ofstrem或者是ostrstream和ostringstream類對象,做到通用性。 重載運算符,我們知道可以是非成員方式也可以是成員方式的,對于來說同樣也可以是成員方式,但我十分不推薦這么做,因為對于類的成員函數(shù)來說,第一個參數(shù)始終是會被隱藏的,而且一定是當前類類型的。 下面的示例代碼就是將上面的重載函數(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); 從代碼實現(xiàn)上,我們將函數(shù)修改成了ostream& operator (ostream &out),迫不得已將ostream類型的引用參數(shù)放到了后面,這是因為,

48、成員方式運算符重載函數(shù)第一個參數(shù)會被隱藏,而且一定是當前類類型的,這和ostream類型沖突了。由此我們在使用cout輸出的時候就必須寫成a為了鞏固學習,下面我們以fstream對象輸出為例做一個練習。 代碼如下: 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)建失敗,磁盤錯誤! system(pause); C+的iostream標準庫介紹以及對左移與右移運算符的重載/school 2005-04-15 10:28:36 來源: 網(wǎng)易學院對于左移運算符重載函數(shù)來說,由于不推薦使用成員方式,那么使用非成員方式在類有多重繼承的情況下,就不能使用虛函數(shù)進行左移運算符重載的區(qū)分,為了達到能夠區(qū)分顯示的目的,給每個類分別添加不同的虛函數(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+運算符重載賦值運算符/school 2005-04-15 10:23:05 來源: 網(wǎng)易學院自定義類的賦值運算符重載函數(shù)的作用與內置賦值運算符的作用類似,但是要要注意的是,它與拷貝構造函數(shù)與析構函數(shù)一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定默認的賦值運算符重載函數(shù),那么

53、系統(tǒng)將會自動提供一個賦值運算符重載函數(shù)。 賦值運算符重載函數(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)/賦值運算符重載函數(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(中國軟件開發(fā)實驗室,); Internetb=a;/b對象還不存在,所以調用拷貝構造函數(shù),進行構造處理。 coutendlb.urlendl; Internetc(美國在線,); b=c;/b對象已經(jīng)存在,所以系統(tǒng)選擇賦值運算符重

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

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

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

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論