上一篇文章主要收集了前面五章的內容,http://blog.csdn.net/rocket5725/archive/2009/09/17/4563837.aspx
本章主要對語句、函數、標準IO庫進行匯總。
六、語句
C++語言既有只完成單一任務的簡單語句,也有作為一個單元執行的由一組語句組成的複合陳述式。本章主要講解討論C++支援的語句。
1、break語句用於結束最近的while、do while、for或switch語句,並將程式的執行權傳遞給緊接在被終止語句之後的語句。
2、continue語句導致最近的迴圈語句的當次迭代提前結束。
3、C++的異常處理包括:throw運算式、try塊、由標準庫定義的一組異常類。
4、使用前置處理器進行調試:$ cc -DNDEBUG main.c
同時還提供了四種在調試時非常有用的常量。
if(word.size()<threshold)<br /> cerr<<"Error:"<<__FILE__ //檔案名稱<br /> <<":line "<<__LINE__<<endl //當前行號<br /> <<" Compiled on"<<__DATE__ //檔案被編譯的日期<br /> <<"at"<<__TIME__<<endl //檔案被編譯的時間<br /> <<" Word read was"<<endl
5、另一個調試技術是使用NDEBUG預先處理變數以及assert預先處理宏。assert宏是在cassert標頭檔中定義的,所有使用assert的檔案都必須包含這個標頭檔。
assert(word.size()>threshold);
七、函數
本章節介紹函數的定義和聲明,其中討論了如何給函數傳遞參數以及如何從函數傳回值,然後具體分析三類特殊的函數:內嵌函式、類成員函數和重載函數,最後討論"函數指標"。
1、函數必須指定傳回型別,沒有顯式指定傳回型別是不合法的:
test(double v1,double v2){/*....*/} //Error:沒有傳回值
2、每次調用函數時,都會重新建立該函數所有的形參,此時所傳遞的實參將會初始化對應的形參;形參的初始化與變數的初始化一樣,如果形參具有非參考型別,則複製實參的值,如果形參為參考型別,則它只是實參的別名。
3、非引用形參
(1) 指標形參
#include <iostream><br />using namespace std;<br />void reset(int *ip)<br />{<br />*ip=0;<br />ip=0;<br />}<br />int main()<br />{<br />int i=42;<br />int *p=&i;<br />cout<<"i="<<*p<<endl; //輸出i=42<br />reset(p);<br />cout<<"i="<<i<<endl; //輸出i=0<br />return 0;<br />}
為了保護指標指向的值,則形參需定義為指向const對象的指標
void use_ptr(const int *p)<br />{<br /> //user_ptr may read but not write to *p<br />}
(2) const形參:既可以給該函數傳遞const實參也可以傳遞非const的實參
複製實參並不是在任何情況下都適用,不適宜複製實參的情況包括:當需要在函數中修改實參的值時、當需要以大型物件作為實參傳遞時、當沒有辦法實現對象的複製時。
4、引用形參
(1) 使用引用形參可以返回額外的資訊
(2) 利用const引用避免複製
5、main:處理命令列選項
int main(int argc,char *argv[]){...}
6、含有可變形參的函數
void foo(parm_list,...);<br />void foo(...);
7、千萬不要返回局部對象的引用
const string &manip(const string& s)<br />{<br /> string ret=s;<br /> return ret;//Error:不能返回局部對象的引用<br />}
8、內嵌函式:可以避免函數調用的開銷,內嵌函式應該在標頭檔中定義,這一點與其他函數不同。
inline const string &shorterString(const string &s1,const string &s2)<br />{...}
9、指向函數的指標:是指向函數而非指向對象的指標,如下pf聲明為指向函數的指標。
bool (*pf)(const string &,const string &);
(1) 用typedef簡化函數指標的定義
//該定義表示cmpFcn是一種指向函數的指標類型的名字<br />//該指標類型為指向返回bool類型並帶有兩個const string引用形參的函數的指標<br />typedef bool (*cmpFcn)(const string &,const string &);<br />
(2) 指向函數指標的初始化和賦值
假設有函數如下,在引用函數名但又沒有調用該函數時,函數名被自動解釋為指向函數的指標。
bool lengthCompare(const string &,const string &);
即可以使用函數名對函數指標做初始化或者賦值,如下
cmpFcn pf1=0;<br />cmpFcn pf2=lengthCompare;<br />pf1=lengthCompare;<br />pf2=pf1;
(3) 通過指標調用函數:指向函數的指標可用於調用它所指向的函數,可以不需要使用解引用操作符,直接通過指標調用函數。
cmpFcn pf=lengthCompare;<br />lenthCompare("hi","bye");<br />pf("hi","bye");<br />(*pf)("hi","bye");
八、標準IO庫
C++的輸入/輸出由標準庫提供,標準庫定義了一族類型,支援對檔案和控制視窗等裝置的讀寫(IO),還定義了其他一些類型,使string對象能夠像檔案一樣操作,從而使我們無需IO就能夠實現資料與字元之間的轉換。本章將介紹IO標準庫的基礎知識。
1、IO類型在三個獨立的標頭檔中定義:iostream定義讀寫控制視窗的類型,fstream定義讀寫已命名檔案的類型,而sstream所定義的類型則用於讀寫儲存在記憶體中的string對象。
2、IO對象不可複製或賦值
ofstream out1,out2;<br />out1=out2;//Error:不能賦值操作<br />ofstream print(ofstream);<br />out2=print(out2);//Error:不能複製stream對象、
形參或傳回型別也不能為流類型,如果需要傳遞或返回IO對象,則必須傳遞或返回指定該對象的指標或引用:
ofstream &print(ofstream&);//OK:take a reference,no copy<br />while(print(out2)){...}//OK:pass reference to out2
3、條件狀態:IO標準庫管理一系列條件狀態成員,用來標記給定的IO對象是否處於可用狀態,或者碰到了哪種特定的錯誤。
流必須處於無錯誤狀態,才能用於輸入或輸出。檢測流是否可用的最簡單的方法是檢查其真值:while(cin>>word)<br /> //OK:read operation successful
4、如果需要重新整理所有輸出,最好使用unitbuf操縱符,這個操作符在每次執行完寫操作後都重新整理流:
cout<<unitbuf<<"first"<<" second"<<nounitbuf;<br />//等價於<br />cout<<"first"<<flush<<" second"<<flush;<br />//nounitbuf操作符將流恢複為使用正常的、由系統管理的緩衝區重新整理方式
5、fstream標頭檔定義了三種支援檔案IO的類型:(1) ifstream,由istream派生而來,提供讀檔案的功能;(2) ofstream,由ostream派生而來,提供寫檔案的功能;(3) fstream,由iostream派生而來,提供讀寫同一個檔案的功能。fstream類型除了繼承下來的行為外,還定義了兩個自己的新操作——open和close,以及形參為要開啟的檔案名稱的建構函式。
6、檔案流對象的使用
(1) 檢查檔案開啟是否成功
ifstream infile(ifile.c_str());</p><p>if(!infile)<br />{<br /> cerr<<"error:unable to open input file:"<br /> <<ifile<<endl;<br /> return -1;<br />}
(2) 將檔案流與新檔案重新綁定:在嘗試開啟新檔案之前,必須先關閉當前的檔案流
ifstream infile("file1");<br />infile.close();<br />infile.open("file2");
7、檔案模式:
檔案模式及其含義如下表所示:
| in |
開啟檔案做讀操作 |
| out |
開啟檔案做寫操作 |
| app |
在每次寫之前找到檔案尾 |
| ate |
開啟檔案後立即將檔案定位在檔案尾 |
| trunc |
開啟檔案時清空已存在的檔案流 |
| binary |
以二進位模式進行IO操作 |
out、trunc和app模式只能用於指定與ofstream或fstream對象關聯的檔案;in模式只能用於指定與ifstream或fstream對象關聯的檔案。所有的檔案都可以用ate或binary模式開啟。
8、一個開啟並檢查輸入檔案的程式:由於不清楚流in的目前狀態,因此首先調用close和clear將這個流設定為有效狀態,然後嘗試開啟給定的檔案。
ifstream& open_file(ifstream &in,const string &file)<br />{<br /> in.close();<br /> in.clear();<br /> in.open(file.c_str());<br /> return in;<br />}
9、字串流
(1) istringstream,由istream派生而來,提供讀string的功能
(2) ostringstream,由ostream派生而來,提供寫string的功能
(3) stringstream,由iostream派生而來,提供讀寫string的功能