C++primer學習筆記_第1頁
C++primer學習筆記_第2頁
C++primer學習筆記_第3頁
C++primer學習筆記_第4頁
C++primer學習筆記_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+ Primer第一章 開始1、在 C+中 動作被稱為表達式 expression 以分號結(jié)尾的表達式被稱作語句 statement,C+中最小的程序單元是語句。2、函數(shù)由四部分組成 返回類型 函數(shù)名 參數(shù)表 以及函數(shù)體 前三部分合起來稱為函數(shù)原型 function prototype。3、錯誤類型:語義錯誤,語法錯誤。4、頭文件通過 include 預(yù)處理器指示符 preprocessor include directive 而成為我們程序的一部分 預(yù)處理器指示符用 # 號標識。由于嵌套包含文件的原因 一個頭文件可能,會被多次包含在一個源文件中 條件指示符可防止這種頭文件的重復(fù)處理 。例如

2、:#ifndef BOOKSTORE_H#define BOOKSTORE_H/* Bookstore.h 的內(nèi)容 */#endif5、assert()是 C 語臺標準庫中提供的一個通用預(yù)處理器宏 在代碼中常利用 assert()來判斷一個必需的前提條件 以便程序能夠正確執(zhí)行。6、C+的輸入/輸出功能由輸入/輸出流 iostream 庫提供 輸入/輸出流庫是 C+中一個面向?qū)ο蟮念悓哟谓Y(jié)構(gòu) 也是標準庫的一部分。7、iostream 庫也支持文件的輸入和輸出,必須包含:#include <fstream>。為了打開一個輸出文件 我們必須聲明一個 ofstream 類型的對象:ofst

3、ream outfile( "name-of-file" );為了測試是否已經(jīng)成功地打開了一個文件 我們可以寫出這樣的代碼if ( ! outfile ) / 如文件不能打開值為 falsecerr << "Sorry! We were unable to open the file!n"類似地 為了打開一個文件供輸入 我們必須聲明一個 ifstream 類型的對象ifstream infile( "name of file" );if ( ! infile )cerr << "Sorry! We w

4、ere unable to open the file!n"第二章 C+瀏覽。 1、為什么內(nèi)置數(shù)組類型不支持數(shù)組之間的賦值 支持這種操作需要什么信息?答:數(shù)組具有退化性,數(shù)組在這里退化為指針而不表示整個數(shù)組。而數(shù)組退化得到的指針是常量,因此數(shù)組無法作為operator=的左操作數(shù);組類型(元素類型和長度)完全相同或者元素類型相同但左操作數(shù)的長度大于等于右操作數(shù)的長度。 2、你認為作為一等公民的數(shù)組應(yīng)該支持什么操作?數(shù)組初始化、數(shù)組比較、數(shù)組賦值、數(shù)組大小查詢、數(shù)組索引范圍檢驗等3、構(gòu)造函數(shù),析構(gòu)函數(shù)的作用。類的構(gòu)造函數(shù)主要用來初始化類對象的數(shù)據(jù)成員 析構(gòu)函數(shù)主要負責釋放類對象在生命期

5、內(nèi)申請到的所有資源。4、異常設(shè)計(catch捕捉的類型要與throw的類型一樣)。5、名字空間的使用,它獨立于全局名字空間 我們可以在里面放一些希望聲明在函數(shù)或類之外的實體 名字空間井不改變其中的聲明的意義 只是改變了它們的可視性。第三章 C+數(shù)據(jù)類型1、文字常量:“F”,“f”,“L”,“l(fā)”后綴只能用在十進制形式中。文字常量是不可尋址的。2、變量:變量為我們提供了一個有名字的內(nèi)存存儲區(qū),因此可尋址,同時可以通過程序?qū)ζ溥M行讀 寫和處理。注意命名規(guī)則(如不能以數(shù)字開頭、關(guān)鍵字)。3、指針類型:指針持有另一個對象的地址,使我們能夠間接地操作這個對象。指針都是4個字節(jié)。注意指針的使用。4、字符串

6、類型:學會所有字符串處理函數(shù)的使用。特別注意字符串指針,字符指針的操作。5、const限定修飾符:被const定義的變量必須初始化,因為沒法改變。Const對象的地址只能賦值給const類型的指針。6、引用類型:引用必須被初始化,因為一旦引用被定義,也就不能修改。另外注意const類型的引用的不同。如:const int ival = 1024;/ 錯誤: 要求一個 const 引用int *&pi_ref = &ival;const int ival = 1024;/ 仍然錯誤const int *&pi_ref = &ival;如果我們從右向左讀這個定義會發(fā)

7、現(xiàn) pi_ref 是一個指向定義為 const 的 int 型對象的指針,引用不是指向一個常量 而是指向一個非常量指針 指針指向一個 const 對象。正確的定義如下:const int ival = 1024;/ ok: 這是可以被編譯器接受的const int *const &pi_ref = &ival;7、bool類型:它不能被聲明為 signed unsigned short 或 long; 當表達式需要一個算術(shù)值時 布爾對象(如 found)和布爾文字都被隱式地提升成 int(正如下面的例子) false 變成 0 而 true 變成 1。8、枚舉類型:枚舉類型用關(guān)

8、鍵字 enum 加上一個自選的枚舉類型名來定義 類型名后面跟一個用花括號括起來的枚舉成員列表 枚舉成員之間用逗號分開 在缺省情況下 第一個枚舉成員被賦以值 0 后面的每個枚舉成員依次比前面的大 1。如:/ point2d = 2, point2w = 3, point3d = 3, point3w = 4enum Points point2d = 2, point2w, point3d = 3, point3w ;9、 數(shù)組類型:一個數(shù)組不能被另外一個數(shù)組初始化 也不能被賦值給另外一個數(shù)組 而且 C+不允許聲明一個引用數(shù)組(即由引用組成的數(shù)組);數(shù)組維數(shù)的指定必須是常量表達式。10、 vect

9、or容器類:與數(shù)組不同,可以進行賦值。具有兩種不同形式(數(shù)組形式和STL形式,區(qū)別在與是否固定大?。?。典型的對vector容器的操作是采用迭代器。同時初始化時特別注意。如:Vector <int> arr = 1,2,3;/錯誤,不能以該中方式,進行賦值。11、復(fù)數(shù)類型: 復(fù)數(shù) complex number 類是標準庫的一部分,必須包含其相關(guān)的頭文件#include <complex>。每個復(fù)數(shù)都有兩部分 實數(shù)部分和虛數(shù)部分。復(fù)數(shù)支持加 減 乘 除和相等比較。12、typedef名字:使用例子如:typedef vector<int> vec_int;vec

10、_int vec1( 10 );作用:降低聲明復(fù)雜度。13、valotile修飾符:禁止優(yōu)化的作用。14、pair類型:它可以在單個對象內(nèi)部把相同類型或不同類型的兩個值關(guān)聯(lián)起來 為了使用 pair 類必須包含下面的頭文件:#include <utility>例如:pair< string, string > author( "James", "Joyce" );15、類類型:就是自定義的類類型。第四章 表達式1、 什么是表達式:表達式由一個或多個操作數(shù) operand 構(gòu)成 最簡單的表達式由一個文字常量或一個對象構(gòu)成。注意操作符一

11、元、二元、多元。2、 算術(shù)操作符:%,/等。注意上溢、下溢。3、 等于、關(guān)系和邏輯操作符:操作結(jié)果都是bool。4、 賦值操作符:=。注意左值與右值的區(qū)別。5、 遞增遞減:+,-。注意前自增自減與后自增自減的區(qū)別。6、 復(fù)數(shù)操作:算術(shù)數(shù)據(jù)類型不能直接被一個復(fù)數(shù)類對象初始化或賦值 例如 下列代碼將導致編譯錯誤/ 錯誤: 從復(fù)數(shù)到內(nèi)置算術(shù)數(shù)據(jù)類型之間/ 并沒有隱式轉(zhuǎn)換支持double dval = complex_obj;實部虛部的讀?。篸ouble re = complex_obj.real();double im = complex_obj.imag();或者用等價的非成員語法/ 等價于上面的

12、成員語法double re = real( complex_obj );double im = imag( complex_obj );*:同時支持直接輸出。7、 條件操作符:if()。8、 sizeof操作符:siseof 操作符的作用是返回一個對象或類型名的字節(jié)長度。同時sizeof是在編譯時刻計算,所以是常量表達式。而且它有以下三種形式:sizeof (type name );sizeof ( object );sizeof object;9、 new和delete表達式:new和delete成對出現(xiàn),且new的對象是在堆中。另外還有一個特點就是new出來的對象都是未命名的。10、逗號操

13、作符:逗號表達式的結(jié)果是最右邊表達式的值。11、位操作符:12、bitset操作:13、優(yōu)先級:主要是符號也運算優(yōu)先級。14、類型轉(zhuǎn)換:一、隱式轉(zhuǎn)換:如:int num = 3.14;二、算術(shù)轉(zhuǎn)換:如:int+float+double = double;三、顯示轉(zhuǎn)換:如:static_cast四、舊式強制轉(zhuǎn)換:如:int ival = (int) 3.14159;15、棧類實例:就是把前面的知識用在一個簡單類里面進行實現(xiàn),驗證。第五章 語句1、 簡單語句和復(fù)合語句:簡單語句:如:int num =5。復(fù)合語句:一對花括號括起來的語句。2、聲明語句:如:int ivar;注意聲明的局部性。3、i

14、f語句:按條件執(zhí)行。4、switch語句:選擇語句。5、for語句:循環(huán)語句。6、while語句:循環(huán)語句。7、do while 語句:循環(huán)語句。8、break語句:結(jié)束循環(huán)。9、continue語句:結(jié)束本次循環(huán)。10、goto語句:跳轉(zhuǎn)語句,可以實現(xiàn)循環(huán)。如: A: goto A;第六章 抽象容器類型1、 我們的文本查詢系統(tǒng):分析該系統(tǒng)的需要。2、 Vector還是list:vector內(nèi)存連續(xù),隨機訪問效率高;list內(nèi)存不連續(xù),隨機添加刪除效率高。兩者相比,數(shù)據(jù)越大越復(fù)雜,vector效率就越低,list就越高。下面是選擇順序容器類型的一些準則:(1)如果我們需要隨機訪問一個容器 則

15、vector 要比 list 好得多(2)如果我們已知要存儲元素的個數(shù) 則 vector 又是一個比 list 好的選擇(3)如果我們需要的不只是在容器兩端插入和刪除元素則 list 顯然要比 vector 好3、 Vector怎樣自己增長:當vector被占滿后,繼續(xù)插入元素時候,就會分配二倍與當前容量大小的內(nèi)存。數(shù)據(jù)越大越復(fù)雜,vector效率就越低-如:4、 定義一個順序容器:能夠定義的容器的類型有三個限制:元素類型必須支持等于操作符。元素類型必須支持小于操作符 前面討論的所有關(guān)系操作符都用這兩個操作符來實現(xiàn)。元素類型必須支持一個缺省值。5、 迭代器:迭代器 iterator 提供了一種

16、一般化的方法 對順序或關(guān)聯(lián)容器類型中的每個元素進行連續(xù)訪問。每種容器類型都提供一個 begin()和一個 end()成員函數(shù)*:begin()返回一個 iterator 它指向容器的第一個元素*:end()返回一個 iterator 它指向容器的末元素的下一個位置6、 順序容器操作:插入,刪除等操作。如:push_back(),pop_back(),insert(),erase(),swap();互換:如果兩個容器的長度不同 則容器的長度就被重新設(shè)置 且等于被拷貝容器的長度7、 存儲文本行:一次讀取一行,getline,然后進行單詞拆分。8、 找到一個子串: string name( &quo

17、t;AnnaBelle" );int pos = name.find( "Anna" );if ( pos = string:npos )cout << "Anna not found!n"else cout << "Anna found at pos: " << pos << endl;pos = name.find_first_of( numerics, pos )-à說明:在name字符串里面查找出現(xiàn)numberics里面任何一個字符首次出現(xiàn)的位置,從name的

18、pos位置開始查找。沒有則返回-1.pos = name.find_last_of( numerics, pos )-à說明:在name字符串里面查找出現(xiàn)numberics里面任何一個字符最后一次出現(xiàn)的位置,從name的pos位置開始查找。沒有則返回-1.9、 處理標點符號:處理標點符號跟處理空格類似。10、任意其他格式的字符串:string字符串的compare和replace等函數(shù)的使用問題。11、其他string操作:erase,insert,find,append,assign等操作。12、生成文本位置map:map的定義如:map<string, int> wo

19、rd_count; 訪問map的int值方法:int age=word_count“xiafusen”;但是如果map中不存在”xiafusen”這樣的鍵值,就會發(fā)生新插入一個一”xiafsen”為鍵值,0為age的一對map值。為了避免這樣的事情發(fā)生,則必須要先知道你面是否存在鍵值”xiafusen” 方法判斷word_count.count( "xiafusen" )返回值;或則使用find函數(shù)。如:int count = 0;map<string,int>:iterator it = word_count.find( "wrinkles"

20、; );if ( it != word_count.end() )count = (*it).second; 對map的迭代就像對vector的迭代是一樣的。Begin、end等。訪問第一個元素為:對象.frist,訪問第二個元素為:對象.second。13、 創(chuàng)建單詞排序集:注意set與vector的區(qū)別。Set中不存在相同的元素存在。14、 完整的程序:程序的實現(xiàn)代碼。15、 mutilmap,mutilset:map 和 set 只能包含每個鍵的單個實例 而 multiset 和 multimap 允許要被存儲的鍵出現(xiàn)多次。因此不支持下標操作。16、棧:先進后出17、對列和優(yōu)先級隊列:先

21、進先出。標準庫提供兩種隊列->FIFO隊列和優(yōu)先級隊列。18、回顧istack類:解除某些限制,重寫某些函數(shù)。第七章 函數(shù)1、概述:函數(shù)返回值,函數(shù)參數(shù),函數(shù)體,函數(shù)名。函數(shù)的聲明描述了函數(shù)的接口,如:參數(shù)列表,返回值等。2、函數(shù)原型: (1)函數(shù)返回值:函數(shù)返回類型可以是預(yù)定義類型;如 int 或 double。 復(fù)合類型;如 int&或 double*280。用戶定義類型;如枚舉 類或 void 后者意指函數(shù)不返回值。 (2)函數(shù)參數(shù)表:不能省略,逗號隔開。 (3)參數(shù)類型檢查:每個函數(shù)調(diào)用的實參在編譯鏈接是都會經(jīng)過參數(shù)類型檢查。3、參數(shù)傳遞:所有的函數(shù)都使用在程序運行棧 r

22、un-time stack 中分配的存儲區(qū) 該存儲區(qū)一直保持與該函數(shù)相關(guān)聯(lián) 直到函數(shù)結(jié)束為止。(1)引用參數(shù):第一種用法:像 swap()的情況 它必須將一個參數(shù)改變成指針來允許改變實參的值時就比較合適。第二種普遍用法是向主調(diào)函數(shù)返回額外的結(jié)果 。第三種用法是向函數(shù)傳遞大型類對象,避免額外的負責帶來的開銷。(2)應(yīng)用參數(shù)和指針參數(shù)的關(guān)系:應(yīng)用必須被初始化指向一個對象,而指針并不必須要初始化。(3)數(shù)組參數(shù):永遠不可能按值傳遞,另外聲明時與數(shù)組長度無關(guān)。(4)抽象容器類參數(shù):如:void show(vector<string> vstr);(5)缺省實參:char *screenIn

23、it( int height = 24, int width = 80,char background = ' ' ); char *cursor;/ 等價于 screenInit(24,80, ' ')cursor = screenInit();(6)省略號:典型的函數(shù)printf。聲明如:int printf( const char* . );省略號有下列兩種形式void foo( parm_list, . );void foo( . );4、返回一個值:由return返回的內(nèi)容。這條語句結(jié)束整個函數(shù)。另外可以通過return返回結(jié)果。一個具有返回類型的函數(shù)

24、必須具有返回值,要不然編譯要出現(xiàn)錯誤。另外如果實際的返回值如果跟返回值類型不同,則進行隱式轉(zhuǎn)換,如果不能通過隱式轉(zhuǎn)換,那么就會出現(xiàn)編譯錯誤。同時你會發(fā)現(xiàn)如果返回的對象比較大的時候返回引用,指針比返回值高效許多。5、遞歸:直接或間接的調(diào)用自己的函數(shù)被稱為遞歸函數(shù)。因此必須有個結(jié)束條件。如:int rgcd( int v1, int v2 )if ( v2 != 0 )return rgcd( v2, v1%v2 );return v1;6、inline函數(shù):若一個函數(shù)被指定為 inline 函數(shù) 則它將在程序中每個調(diào)用點上被 內(nèi)聯(lián)地 展開 例如int minVal2 = min( i, j );

25、在編譯時被展開為:int minVal2 = i < j << i : j;注意: inline 指示對編譯器來說只是一個建議 編譯器可以選擇忽略該建議 因為把一個函數(shù)聲明為 inline 函數(shù) 并不見得真的適合在調(diào)用點上展開。因此inline只是用于那些較小,只有幾行代碼,經(jīng)常被調(diào)用的函數(shù)。7、鏈接提示符,extern “C”:注意:不能放在函數(shù)體內(nèi)。程序員用鏈接指示符 linkage directive 告訴編譯器 該函數(shù)是用其他的程序設(shè)計語言編寫的 鏈接指示符有兩種形式 既可以是單一語句 single statement 形式 也可以是復(fù)合語句 compound sta

26、tement 形式/ 單一語句形式的鏈接指示符extern "C" void exit(int);/ 復(fù)合語句形式的鏈接指示符extern "C" int printf( const char* . );int scanf( const char* . );/ 復(fù)合語句形式的鏈接指示符extern "C" #include <cmath>8、main處理命令行參數(shù):int main( int argc, char *argv ) . argc 包含命令行選項的個數(shù) argv 包含 aygc 個 C 風格字符串。9、專項函數(shù)

27、的指針:(1)指向函數(shù)指針的類型:定義:如 int myadd(int x,int y);-àint (*pf)(int x ,int y);省略號是函數(shù)類型的一部分 如果兩個函數(shù)具有相同的參數(shù)表 但是一個函數(shù)在參數(shù)表末尾有省略號 則它們被視為不同的函數(shù)類型(2)初始化和賦值:初始化:如 int myadd(int x,int y);-àint (*pf)(int x ,int y)=&myadd;賦值:pf = &myadd;(3)調(diào)用:調(diào)用:如 int x=5,y=6; pf(x,y);或(*pf)(x,y);(4)函數(shù)指針的數(shù)組:如: int (*pf

28、10)(int x ,int y);(5)參數(shù)和返回類型:函數(shù)不能聲明一個返回類型為函數(shù)類型,如果是就會發(fā)生編譯錯誤。(6)指向extern “C”的函數(shù)指針:指針 pf 指向一個 C 函數(shù)如:extern "C" void (*pf)(int); 當用 pf 調(diào)用一個函數(shù)時 被調(diào)用的函數(shù)是一個 C 函數(shù)extern "C" void exit(int); 注意指向 C 函數(shù)的指針與指向 C+函數(shù)的指針類型是不同的。第八章 域和生命周期1、 域:C+支持三種形式的域:局部域(函數(shù)空間內(nèi),變量的聲明周期可以體現(xiàn)這一點),名字空間域(namespace,如:

29、using namespace std)和類域。*:注意習題,比較刁鉆。2、全局對象和函數(shù):全局域里面的對象、函數(shù)被稱為全局對象,全局函數(shù)。(1)聲明和定義:如:int x;/全局對象聲明,若對象未初次化,則默認為0。 int add(int& x,int& y);/全局函數(shù)聲明void mian()重點:注意extern的使用來實現(xiàn)一個全局變量在多個文檔中被使用。(2)不同文件之間聲明的匹配:注意要類型什么都一樣。(3)談?wù)勵^文件:一下是定義頭文件幾個需要注意的地方:頭文件提供的聲明邏輯上應(yīng)該屬于一個組;頭文件不應(yīng)該含有非 inline 函數(shù)或?qū)ο蟮亩x;3、局部對象:有三種

30、局部對象: 1.自動對象2.寄存器對象3.局部靜態(tài)變量(1)自動對象:自動對象的地址不應(yīng)該被作為函數(shù)的返回值,因為函數(shù)一旦結(jié)束,改地址就指向一個無效地地址。當一個自動變量的地址被存儲在一個生命期長于它的指針時 該指針被稱為空懸指針。(2)寄存器自動對象:如:for ( register int ix = 0; ix < sz; +ix )/.如果所選擇的變量被頻繁使用 則寄存器變量可以提高函數(shù)的執(zhí)行速度關(guān)鍵字 register 對編譯器來說只是一個建議 有些編譯器可能忽略該建議。(3)靜態(tài)局部對象:靜態(tài)局部對象在程序執(zhí)行到該對象的聲明處時被首次初始化;例如 下面是 gcd()的一個版本

31、它占用一個靜態(tài)局部對象來跟蹤遞歸的深度#include <iostream>int traceGcd( int v1, int v2 )static int depth = 1;cout << "depth #" << depth+ << endl;if ( v2 = 0 ) depth = 1;return v1;return traceGcd( v2, v1%v2 );另外未經(jīng)過初始化的對象,默認值為0,自動對象則為隨機的。4、動態(tài)分配的對象:動態(tài)分配的對象允許程序員完全控制它的分配與釋放。(1)單個對象的動態(tài)分配與釋放:

32、如:new int;new int(5);int *p = new int;int *p = new int(5);delete p;(2)auto_ptr:必須包含頭文件#include<memeory>定義有下列三種形式:auto_ptr< type_pointed_to > identifier( ptr_allocated_by_new );auto_ptr< type_pointed_to > identifier( auto_ptr_of_same_type );auto_ptr< type_pointed_to > identifi

33、er;注意:不能讓auto_ptr指向不是new出來的對象;不能讓兩個auto_ptr指向同一個地方。(3)數(shù)組的動態(tài)分配與釋放:如:為避免動態(tài)分配數(shù)組的內(nèi)存管理帶來的問題 一般建議使用標準庫 vector list 或 string容器類型 這些類型都會自動管理內(nèi)存分配。(4)常量對象的動態(tài)分配與釋放:注意必須初始化,以及指針必須為從const類型。(5)定位new表達式:new 表達式的第三種形式可以允許程序員要求將對象創(chuàng)建 在已經(jīng)被分配好的內(nèi)存中;自己沒有看懂什么意思。5、名字空間定義:(1)名字空間定義:如:注意:名字空間定義不一定是連續(xù)的。(2)域操作符:就是 :在用到名字空間的時候

34、,會使用域操作符(:)實現(xiàn)函數(shù),對象等的訪問。(3)嵌套名字空間:如:訪問的方法:在嵌套名字空間 MatrixLib 中聲明的類的名字是cplusplus_primer:MatrixLib:matrix函數(shù)的名字是cplusplus_primer:MatrixLib:inverse(4 名字空間成員定義:名字空間成員可以被定義在名字空間定義之外,只有當一個名字空間成員在名字空間定義中已經(jīng)被聲明過 它才能在該名字空間定義之外被定義。(5)ODR和名字空間成員:名字空間的對象、函數(shù)只做聲明,在其他文件中實現(xiàn)定義。(6)未命名的名字空間: 如:namespace/*、*/目的:局部與某文件中,在其他

35、文件中不可見。就可以避免名字沖突。6、使用名字空間成員:(1)名字空間別名:例如 長名字空間名如namespace International_Business_Machines /* . */ 可以與一個較短的同義詞相關(guān)聯(lián) 如下namespace IBM = International_Business_Machines;那么:International_Business_Machine:show()-àIBM:show();(2)using聲明:如:using namespace std;在后面使用std空間類的對象,函數(shù)就可以直接使用,而不需要帶名字空間作為說明了。(3) us

36、ing指示符:using 指示符以關(guān)鍵字 using 開頭 后面是關(guān)鍵字 namespace 然后是名字空間名。(4) 標準名字空間std:里面包含<iostream>,<vector>等。第九章 重載函數(shù) 1、重載函數(shù)聲明:函數(shù)重載 function overloading 允許多個函數(shù)共享同一個函數(shù)名 但是針對不同參數(shù)類型提供共同的操作。(1)為什么要重載一個函數(shù)名:實現(xiàn)多態(tài)。(2)怎樣重載一個函數(shù)名:可以為兩個或多個函數(shù)提供相同的名字 只要它們的每個參數(shù)表惟一就行,或者是參數(shù)的個數(shù)不同 或者是參數(shù)類型不同。(3)何時不重載一個函數(shù)名:如果不同的函數(shù)名所提供的信息可

37、使程序更易于理解的話 則再用重載函數(shù)就沒有什么好處了。(4)重載與域:重載函數(shù)集合中的全部函數(shù)都應(yīng)在同一個域中聲明 例如 一個聲明為局部的函數(shù)將隱藏而不是重載一個全局域中聲明的函數(shù)(5)extern “c”和重載函數(shù):鏈接指示符只能指定重載函數(shù)集中的一個函數(shù)。(6)指向重載函數(shù)的指針:void ( *pf1 )( unsigned int ) = &ff;unsigned int部分決定pf1指向那個函數(shù)。(7)類型安全連接:不適用于用鏈接指示符 extern "C"聲明的函數(shù)。 2、重載解析的三個步驟:1 .確定函數(shù)調(diào)用考慮的重載函數(shù)的集合 確定函數(shù)調(diào)用中實參表的

38、屬性2 .從重載函數(shù)集合中選擇函數(shù) 該函數(shù)可以在 給出實參個數(shù)和類型 的情況下用調(diào)用中指定的實參進行調(diào)用。3 .選擇與調(diào)用最匹配的函數(shù)3、參數(shù)類型轉(zhuǎn)換:可能存在的轉(zhuǎn)換如下:從左值到右值的轉(zhuǎn)換;從數(shù)組到指針的轉(zhuǎn)換;從函數(shù)到指針的轉(zhuǎn)換;限定修飾轉(zhuǎn)換;為一個函數(shù)調(diào)用選擇最佳可行函數(shù)時 編譯器會選擇在實參的類型轉(zhuǎn)換方面 最好 的一個函數(shù) 函數(shù)轉(zhuǎn)換被劃分等級如下 精確匹配比提升好 提升比標準轉(zhuǎn)換好 標準轉(zhuǎn)換比用戶定義的轉(zhuǎn)換好(1)精確匹配的細節(jié):精確匹配最簡單的例子是實參與函數(shù)參數(shù)類型精確匹配。 精確匹配中從左值到右值 從數(shù)組到指針以及從函數(shù)到指針的轉(zhuǎn)換通常被稱為左值轉(zhuǎn)換 。(2)提升的細節(jié):提升實際上

39、就是下列轉(zhuǎn)換之一1.char unsigned char 或 short 型的實參被提升為 int 型 如果機器上 int 型的字長比short 整型的長 則 unsigned short 型的實參被提升到 int 型 否則 它被提升到unsigned int 型;2.float 型的實參被提升到 double 類型;3.枚舉類型的實參被提升到下列第一個能夠表示其所有枚舉常量的類型 int 、unsigned int、 long 或 unsigned long;4.布爾型的實參被提升為 int 型;(3)標準轉(zhuǎn)換的細節(jié):(4)引用:重點:注意應(yīng)用對轉(zhuǎn)換的應(yīng)用。4、函數(shù)重載解析細節(jié):注意函數(shù)重載

40、解析過程的三個步驟。(1)候選函數(shù):候選函數(shù)與被調(diào)用的函數(shù)具有同樣的名字。(2)可行函數(shù):可行函數(shù)是候選函數(shù)集合中的函數(shù) 它的參數(shù)表或者與調(diào)用中的實參數(shù)目相同 或者有更多的參數(shù)??尚泻瘮?shù)是這樣的函數(shù) 對于每個實參 都存在到函數(shù)參數(shù)表中相應(yīng)的參數(shù)類型之間的轉(zhuǎn)換。(3)最佳可行函數(shù):最佳可行函數(shù)是具有與實參類型匹配最好的參數(shù)的可行函數(shù),就是最后被執(zhí)行的那個函數(shù)。(4)缺省實參:缺省實參可以使多個函數(shù)進入到可行函數(shù)集合中 ,可行函數(shù)是指可以用調(diào)用中指定的實參進行調(diào)用的函數(shù) 。可行函數(shù)可以有比函數(shù)調(diào)用實參表中的實參個數(shù)更多的參數(shù),只要每個多出來的參數(shù)都有相應(yīng)的缺省實參即可。如;第十章 函數(shù)模板1、函數(shù)

41、模板的定義:如:關(guān)鍵字 typename 也可以被用在模板參數(shù)表中 以指示一個模板參數(shù)是一個類型如同非模板函數(shù)一樣, 函數(shù)模板也可以被聲明為 inline 或 extern 應(yīng)該把指示符放在模板參數(shù)表后面 而不是在關(guān)鍵字 template 前面。如: 重點:如果一個函數(shù)模板有一個以上的模板類型參數(shù) 則每個模板類型參數(shù)前面都必須有關(guān)鍵字 class 或 typename。2、函數(shù)模板實例化:函數(shù)模板指定了怎樣根據(jù)一組或更多實際類型或值構(gòu)造出獨立的函數(shù) ,這個構(gòu)造過程被稱為模板實例化。3、模板實參推演:當函數(shù)模板被調(diào)用時 對函數(shù)實參類型的檢查決定了模板實參的類型和值 ,這個過程被稱為模板實參推演。

42、如:template<class type>type Mysum(type x,type y);-à mysum(5,10);可以推演出type為int類型。4、顯示模板實參: 如:template<class type>type Mysum(type x,type y);-à mysum<int>(5,10);顯示指出type為int類型。 5、模板編譯模式:C+支持兩種方式的編譯模式:1.包含模式 2.分離模式(1)包含編譯模式:在包含編譯模式下 我們在每個模板被實例化的文件中包含函數(shù)模板的定,并且往往把定義放在頭文件中 像對內(nèi)聯(lián)函數(shù)

43、所做的那樣。說白了就是在頭文件聲明的時候就直接定義了。(2)分離編譯模式:頭文件只負責聲明,然后再.c文件中使用export說明并進行定義。(3)顯示實例化聲明:在顯式實例化聲明所在的文件中,函數(shù)模板的定義必須被給出。如:說明:對于給定的函數(shù)模板實例,顯式實例化聲明在一個程序中只能出現(xiàn)一次。 6、模板顯示特化:函數(shù)模板 sum()被顯式特化:template <class T1, class T2, class T3>T1 sum( T2 op1, T3 op2 );/ 顯式特化聲明/ 錯誤: T1 的模板實參不能被推演出來/ 它必須顯式指定template<> dou

44、ble sum( float, float );/ ok: T1 的實參被顯式指定/ T2 和 T3 可以從 float 推演出來template<> double sum<double>( float, float );/ ok: 所有實參都顯式指定template<> int sum<int,char,char>( char , char ); 7、重載函數(shù)模板:如:8、考慮模板函數(shù)實例的重載解析:跟重載函數(shù)的解析過程基本一樣。9、模板定義函數(shù)實例的重載解析:同上。10、名字空間和函數(shù)模板:同樣,要先用using聲明函數(shù)。11、函數(shù)模板示例:

45、 模板的定義和使用的例子程序,有必要讀一讀。第十一章 異常處理1、 拋出異常:異常 Exception 是程序可能檢測到的,運行時刻不正常的情況;如被 0 除,數(shù)組越界訪問或空閑存儲內(nèi)存耗盡等等。2、 Try塊: try 塊必須包圍能夠拋出異常的語句 ,try 塊以關(guān)鍵字 try 開始,后面是花括號括起來的,語句序列 在 try 塊之后是一組處理代碼 被稱為 catch 子句。3、 捕獲異常:catch塊進行異常處理。(1)異常對象:catch 子句的異常聲明可以是一個類型聲明或一個對象聲明,這完全取決于throw拋出類型。(2)棧展開:在查找用來處理被拋出異常的 catch 子句時 因為異常

46、而退出復(fù)合語句和函數(shù)定義 這個過程被稱作棧展開;隨著棧的展開,盡管局部類對象的生命期是因為拋出異常而被結(jié)束 但是這些局部類對象的析構(gòu)函數(shù)也會被調(diào)用。(3)重新拋出:在catch塊中繼續(xù)拋出異常。(4)catch-all處理代碼:即使一個函數(shù)不能處理被拋出的異常。但是它也可能希望在帶著異常退出之前執(zhí)行一些動作。如:說明:這種 catch 子句有一個形式為( .) 的異常聲明,這里的點被稱為省略號,對任何類型的異常,都會進入這個 catch 子句。4、 異常規(guī)范:如:說明:聲明時指明了異常規(guī)范,那么定義的時候也必須注明異常規(guī)范。額外:異常規(guī)范與函數(shù)指針:5、 異常與設(shè)計事項:雖然對于異常處理的支持

47、是被內(nèi)置在語言中的,但并不是每個 C+程序都應(yīng)該使用異常處理,因為拋出異常不像正常函數(shù)調(diào)用那樣快,所以異常處理應(yīng)該用在獨立開發(fā)的不同程序部分之間,用于不正常情況的通信。第十二章 泛型算法1、 概述:每個泛型算法的實現(xiàn)都獨立于單獨的容器類型。2、 使用泛型算法:把一串泛型算法調(diào)用連接在一起的一個例子程序。3、 函數(shù)對象:函數(shù)對象三種來源:1.標準庫預(yù)定義的一組算術(shù) 關(guān)系和邏輯函數(shù)對象;2.一組預(yù)定義的函數(shù)適配器,允許我們對預(yù)定義的函數(shù)對象,甚至于任何函數(shù)對象進行特殊化或者擴展;3.我們可以定義自己的函數(shù)對象 將其傳遞給泛型算法 或?qū)⑺鼈儌鹘o函數(shù)適配器;(1)預(yù)定義函數(shù)對象:預(yù)定義函數(shù)對象被分成算

48、術(shù)、 關(guān)系和邏輯操作。(2)算術(shù)函數(shù)對象:預(yù)定義的算術(shù)函數(shù)對象支持加 減 乘 除 求余和取反。如:Plus,multiplies,divides,modulus,negate;(3)關(guān)系函數(shù)對象:預(yù)定義的關(guān)系函數(shù)對象支持等于 不等于 大于 大于等于 小于和小于等于;如:equal_to,not_equal_to,greater,greater_equal,less,less_equal;(4)邏輯函數(shù)對象:預(yù)定義的邏輯函數(shù)對象支持邏輯與,邏輯非,邏輯或;如:logical_and,logical_or,logical_not;(5)函數(shù)對象的函數(shù)適配器:被分為綁定器(binder)和取反器(n

49、egator);如:重點;(6)實現(xiàn)函數(shù)對象:實現(xiàn)小于等于功能。用類的方式實現(xiàn)。4、 回顧iterator:只是就舉了一個iterator的使用例子。(1)插入iterator:back_inserter();front_inserter();inserter();如: 實現(xiàn)將ivec中所有內(nèi)容插入到Vres中。 unique_copy( ivec.begin(), ivec.end(),back_inserter( vres );/后面插入unique_copy( ivec.begin(), ivec.end(),front_inserter( vres );前面插入unique_copy(

50、 ivec.begin(), ivec.end(),inserter( vres, vres.begin() );/指定位置插入。(2)反向iterator:反向 iterator 的遍歷方式同前向 iterator 一樣,不同的是對于前向 iterator +操作訪問容器中的下一個元素,對于反向 iterator 它訪問的是前面的元素。如:(3)iostream iterator:必須包含頭文件->#include <iterator>;如:istream_iterator< int > input( cin );istream_iterator< int

51、 > end_of_stream;vector<int> vec;copy ( input, end_of_stream, inserter( vec, vec.begin() );sort( vec.begin(), vec.end(), greater<int>() );ostream_iterator< int > output( cout, " " );unique_copy( vec.begin(), vec.end(), output );(4)istream_iterator:如:(3)中的例子;(5)ostream_

52、iterator:如:(3)中的例子,另外定義有兩種方式:(6)五中iterator:InputIterator,OutputIterator, ForwardIterator,BldirectionalIterator,和 RandomAccessIterator。介紹說明:P503。5、 泛型算法(1)查找算法:adjacent_find(), binary_search(), count(), count_if(), equal_range(),find(), find_end(), find_first_of(), find_if(), lower_bound(),upper_boun

53、d(), search(), search_n()(2)排序和通用整序算法:inplace_merge(), merge(), nth_element(), partial_sort(),partial_sort_copy(), partition(), random_shuffle(), reverse(),reverse_copy(), rotate(), rotate_copy(), sort(), stable_sort(),stable_partition();(3)刪除和替換算法:copy(), copy_backwards(), iter_swap(), remove(), re

54、move_copy(),remove_if(), remove_copy_if(), replace(), replace_copy(),replace_if(), replace_copy_if(), swap(), swap_range(), unique(),unique_copy();(4)排列組合算法:next_permutation(), prev_permutation();(5)算法算法:accumulate(), partial_sum(), inner_product(), adjacent_difference();(6)生成和異變算法:fill(), fill_n(),

55、for_each(), generate(), generate_n(), transform();(7)關(guān)系算法:equal(), includes(), lexicographical_compare(), max(), max_element(),min(), min_element(), mismatch();(8)集合算法:set_union(), set_intersection(), set_difference(),set_symmetric_difference();(9)堆算法:make_heap(), pop_heap(), push_heap(), sort_heap(

56、);6、 何時不用泛型算法:如:map,set等關(guān)系容器不適合泛型算法,存儲不連續(xù)。下面是list的容器的一些定制操作:list:merge() 用第二個有序的 list 合并一個有序 listlist:remove() 刪除等于某個值的元素list:remove_if() 刪除滿足某個條件的元素list:reverse() 將 list 中元素反向排列l(wèi)ist:sort() 排序 list 的元素list:splice() 把一個 list 的元素移到另一個 list 中l(wèi)ist:unique() 刪除某個元素的重復(fù)連續(xù)拷貝(1)list:merge():合并兩個有序的list,合并后,il

57、ist2為空。(2)list:remove():為1的所有l(wèi)ist實例全部刪除。(3)list:remove_if():刪除所有偶數(shù)。(4)list:reverse():反向。(5)list:sort():排序。(6)list:splice():搬移。(7)list:unique():使用方式一:使用unique之前,必須保證list序列有序。如:使用方式二:重點 如:第十三章 類1、類定義:類定義包含兩部分:類頭由關(guān)鍵字 class 及其后面的類名構(gòu)成,類體由一對花括號包圍起來 類定義后面必須接一個分號或一列聲明(1)數(shù)據(jù)成員:可以是任意類型。注意,除了靜態(tài)的數(shù)據(jù)成員,其他的任何類型的數(shù)據(jù)成員

溫馨提示

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

評論

0/150

提交評論