天天看點

《C++ Primer中文版》(第四版)資訊彙總(二)

上一篇文章主要收集了前面五章的内容,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的功能