上一篇文章主要收集了前面五章的内容,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)
cerr<<"Error:"<<__FILE__ //檔案名
<<":line "<<__LINE__<<endl //目前行号
<<" Compiled on"<<__DATE__ //檔案被編譯的日期
<<"at"<<__TIME__<<endl //檔案被編譯的時間
<<" 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>
using namespace std;
void reset(int *ip)
{
*ip=0;
ip=0;
}
int main()
{
int i=42;
int *p=&i;
cout<<"i="<<*p<<endl; //輸出i=42
reset(p);
cout<<"i="<<i<<endl; //輸出i=0
return 0;
}
為了保護指針指向的值,則形參需定義為指向const對象的指針
void use_ptr(const int *p)
{
//user_ptr may read but not write to *p
}
(2) const形參:既可以給該函數傳遞const實參也可以傳遞非const的實參
複制實參并不是在任何情況下都适用,不适宜複制實參的情況包括:當需要在函數中修改實參的值時、當需要以大型對象作為實參傳遞時、當沒有辦法實作對象的複制時。
4、引用形參
(1) 使用引用形參可以傳回額外的資訊
(2) 利用const引用避免複制
5、main:處理指令行選項
int main(int argc,char *argv[]){...}
6、含有可變形參的函數
void foo(parm_list,...);
void foo(...);
7、千萬不要傳回局部對象的引用
const string &manip(const string& s)
{
string ret=s;
return ret;//Error:不能傳回局部對象的引用
}
8、内聯函數:可以避免函數調用的開銷,内聯函數應該在頭檔案中定義,這一點與其他函數不同。
inline const string &shorterString(const string &s1,const string &s2)
{...}
9、指向函數的指針:是指向函數而非指向對象的指針,如下pf聲明為指向函數的指針。
bool (*pf)(const string &,const string &);
(1) 用typedef簡化函數指針的定義
//該定義表示cmpFcn是一種指向函數的指針類型的名字
//該指針類型為指向傳回bool類型并帶有兩個const string引用形參的函數的指針
typedef bool (*cmpFcn)(const string &,const string &);
(2) 指向函數指針的初始化和指派
假設有函數如下,在引用函數名但又沒有調用該函數時,函數名被自動解釋為指向函數的指針。
bool lengthCompare(const string &,const string &);
即可以使用函數名對函數指針做初始化或者指派,如下
cmpFcn pf1=0;
cmpFcn pf2=lengthCompare;
pf1=lengthCompare;
pf2=pf1;
(3) 通過指針調用函數:指向函數的指針可用于調用它所指向的函數,可以不需要使用解引用操作符,直接通過指針調用函數。
cmpFcn pf=lengthCompare;
lenthCompare("hi","bye");
pf("hi","bye");
(*pf)("hi","bye");
八、标準IO庫
C++的輸入/輸出由标準庫提供,标準庫定義了一族類型,支援對檔案和控制視窗等裝置的讀寫(IO),還定義了其他一些類型,使string對象能夠像檔案一樣操作,進而使我們無需IO就能夠實作資料與字元之間的轉換。本章将介紹IO标準庫的基礎知識。
1、IO類型在三個獨立的頭檔案中定義:iostream定義讀寫控制視窗的類型,fstream定義讀寫已命名檔案的類型,而sstream所定義的類型則用于讀寫存儲在記憶體中的string對象。
2、IO對象不可複制或指派
ofstream out1,out2;
out1=out2;//Error:不能指派操作
ofstream print(ofstream);
out2=print(out2);//Error:不能複制stream對象、
形參或傳回類型也不能為流類型,如果需要傳遞或傳回IO對象,則必須傳遞或傳回指定該對象的指針或引用:
ofstream &print(ofstream&);//OK:take a reference,no copy
while(print(out2)){...}//OK:pass reference to out2
3、條件狀态:IO标準庫管理一系列條件狀态成員,用來标記給定的IO對象是否處于可用狀态,或者碰到了哪種特定的錯誤。
流必須處于無錯誤狀态,才能用于輸入或輸出。檢測流是否可用的最簡單的方法是檢查其真值:while(cin>>word)
//OK:read operation successful
4、如果需要重新整理所有輸出,最好使用unitbuf操縱符,這個操作符在每次執行完寫操作後都重新整理流:
cout<<unitbuf<<"first"<<" second"<<nounitbuf;
//等價于
cout<<"first"<<flush<<" second"<<flush;
//nounitbuf操作符将流恢複為使用正常的、由系統管理的緩沖區重新整理方式
5、fstream頭檔案定義了三種支援檔案IO的類型:(1) ifstream,由istream派生而來,提供讀檔案的功能;(2) ofstream,由ostream派生而來,提供寫檔案的功能;(3) fstream,由iostream派生而來,提供讀寫同一個檔案的功能。fstream類型除了繼承下來的行為外,還定義了兩個自己的新操作——open和close,以及形參為要打開的檔案名的構造函數。
6、檔案流對象的使用
(1) 檢查檔案打開是否成功
ifstream infile(ifile.c_str());
if(!infile)
{
cerr<<"error:unable to open input file:"
<<ifile<<endl;
return -1;
}
(2) 将檔案流與新檔案重新綁定:在嘗試打開新檔案之前,必須先關閉目前的檔案流
ifstream infile("file1");
infile.close();
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)
{
in.close();
in.clear();
in.open(file.c_str());
return in;
}
9、字元串流
(1) istringstream,由istream派生而來,提供讀string的功能
(2) ostringstream,由ostream派生而來,提供寫string的功能
(3) stringstream,由iostream派生而來,提供讀寫string的功能