《C++ primer plus》讀書筆記(二)
第五章
1、for循環(huán)——for(initialization; test-expression; update-expression) body // test-expression 會(huì)被轉(zhuǎn)換為bool,0為false,非零為true
2、表達(dá)式——表達(dá)式是值或值與運(yùn)算符的組合。賦值表達(dá)式的值為其左側(cè)成員的值,而賦值運(yùn)算符是從右到左結(jié)合的。
3、a++和++a——
?。?)對(duì)于內(nèi)置類型,兩種執(zhí)行效率相同。
?。?)若重載運(yùn)算符,對(duì)于類而言,前綴將值加1,返回結(jié)果;后綴會(huì)復(fù)制一個(gè)副本,加1后返回副本。所以前綴比后綴效率高。
4、逗號(hào)運(yùn)算符——
?。?)for循環(huán)中,將多個(gè)表達(dá)式合并為一個(gè): i++, j++;
?。?)聲明: int i , j;
?。?)逗號(hào)表達(dá)式先計(jì)算第一個(gè)表達(dá)式,再計(jì)算第二個(gè)表達(dá)式。逗號(hào)表達(dá)式的值是第二部分的值。
?。?)逗號(hào)表達(dá)式是優(yōu)先級(jí)最低的表達(dá)式。
5、strcmp()——比較兩個(gè)字符串。接受2個(gè)字符串地址A、B作為參數(shù)。AB相同返回0,A的字母順序在B之前,者返回負(fù)數(shù),否則返回正數(shù)。
?。ㄓ靡?hào)括起的字符串常量是其地址。)
6、clock()——返回程序開始執(zhí)行后所用的系統(tǒng)時(shí)間。這個(gè)值除以CLOCKS_PER_SEC可以得到秒數(shù)。
7、類型別名——#define AA char // 用AA作為char的別名,所有的AA將被char替代
或 typedef AA char
8、cin——cin.get()會(huì)忽略空格和換行符。發(fā)送給cin的輸入會(huì)被緩沖。按下回車鍵,輸入的內(nèi)容才會(huì)被發(fā)送給程序。
cin.get(ch)會(huì)得到每個(gè)字符。其參數(shù)聲明為引用類型,所以函數(shù)可以修改其參數(shù)的值。
9、EOF——很多PC編程環(huán)境都將Ctrl+Z視為模擬的EOF,檢測(cè)到EOF之后,cin將兩位(eofbit和failbit)都設(shè)置為1。eof()和fail()用來(lái)查看是否被設(shè)置。
所以循環(huán)等待輸入的條件可以這樣設(shè)置:while( cin.fail() == false ) {} 或 whle( !cin.fail() ){} 或 while(cin){} 或 while( cin.get(ch) ){}
?。ㄍǔ#珽OF被定義為-1)
第六章
10、運(yùn)算符——!運(yùn)算符的優(yōu)先級(jí)高于所有的關(guān)系運(yùn)算符和算術(shù)運(yùn)算符。
邏輯AND運(yùn)算符的優(yōu)先級(jí)高于邏輯OR運(yùn)算符。
C++確保程序從左到右計(jì)算邏輯表達(dá)式。
11、cctype——字符函數(shù)庫(kù)。如isalpha(ch)判斷字符是不是字母,是字母就返回非零,否則返回0。
12、文本IO——使用cin進(jìn)行輸入時(shí),程序?qū)⑤斎肟醋饕幌盗械淖止?jié),其中每個(gè)字節(jié)被解釋為字符編碼。
第七章
13、定義函數(shù)——
(1)、無(wú)返回值: void functionName(parameterList) {}
(2)、有返回值: typeName functionName(parameterList) {}
?。ㄗ⒁猓》祷刂档念愋筒荒苁菙?shù)組,可以是其他任何類型)
14、函數(shù)原型——
?。?)、函數(shù)原型能極大降低程序出錯(cuò)的幾率、提高效率。
?。?)、函數(shù)原型不要求提供變量名,有類型列表就足夠了。
?。?)、括號(hào)為空與括號(hào)中使用void是等效的,不指定參數(shù)列表應(yīng)使用省略號(hào)——void haha(...);
15、函數(shù)和二維數(shù)組——指針的類型是指把指針聲明語(yǔ)句中的指針名字去掉所剩下的部分
對(duì)于: int data[3][4] = {{1,2,3,4},{5,6,7,8},{4,3,2,1}}; int total = sum(data,3); sum的原型是什么?
?。?)、原型是: int sum ( int (*a) [4] , int size);
所以 int(*)[4]即,將這個(gè)指針指向int[4]。所以data的類型指向由4個(gè)int組成的數(shù)組的指針
所以 int *a[4] 的類型是int * [4],這個(gè)指針指向int,總共有4個(gè),即它是4個(gè)指向int指針組成的數(shù)組。
?。?)、函數(shù)定義: int sum (int a[][4] ,int size);
a[ r ][ c ] = *( *( a + r ) + c);
16、遞歸——每個(gè)遞歸調(diào)用都創(chuàng)建自己的一套變量。
?。ㄗ⒁猓++不允許main()調(diào)用自己。)
17、函數(shù)指針——
?。?)、函數(shù)地址: 函數(shù)的地址是存儲(chǔ)其機(jī)器語(yǔ)言代碼的內(nèi)存的開始地址。如果think()是一個(gè)函數(shù),那么think就是它的地址。
?。?)、聲明指針函數(shù): 函數(shù):double pam(int); 指針函數(shù)為: double (*pf)(int) = pam; // pf是一個(gè)指向函數(shù)的指針。
第八章
18、編譯過(guò)程——編譯過(guò)程的最終產(chǎn)品是可執(zhí)行程序(由一組機(jī)器語(yǔ)言指令組成)。
運(yùn)行程序時(shí),操作系統(tǒng)將這些指令載入到計(jì)算機(jī)內(nèi)存中,因此每條指令都有特定的內(nèi)存地址。計(jì)算機(jī)隨后逐步執(zhí)行這些指令。
19、函數(shù)調(diào)用——執(zhí)行到函數(shù)調(diào)用指令時(shí),程序?qū)⒃诤瘮?shù)調(diào)用后,立即存儲(chǔ)該指令的內(nèi)存地址,并將函數(shù)參數(shù)復(fù)制到堆棧,跳到標(biāo)記函數(shù)起點(diǎn)的內(nèi)存單元,
執(zhí)行函數(shù)代碼(也許還需將返回值放入寄存器),然后跳回到地址被保存的指令處。
20、內(nèi)聯(lián)函數(shù)——編譯器使用相應(yīng)的函數(shù)代碼代替函數(shù)調(diào)用。
函數(shù)聲明前加上關(guān)鍵字inline,函數(shù)定義前加上關(guān)鍵字inline。通常將省略原型,原型處直接定義。
21、引用變量——主要用途是作函數(shù)的參數(shù),函數(shù)將使用原始數(shù)據(jù),而不是其副本。
(1)、創(chuàng)建: int rats ; int & a = rats;
(2)、引用必須在聲明時(shí)初始化,不能先聲明再初始化。也不能通過(guò)賦值來(lái)設(shè)置引用。
?。?)、引用一旦與某個(gè)變量關(guān)聯(lián)起來(lái),就一直效忠。
?。?)、若引用參數(shù)是const,若實(shí)參類型正確卻不是左值 或 類型不正確卻可以轉(zhuǎn)換成正確類型 時(shí),將創(chuàng)建臨時(shí)變量。
?。?)、返回引用時(shí),應(yīng)避免返回函數(shù)終止時(shí)不再存在的內(nèi)存單元引用。
22、左值——
(1)、可被引用的數(shù)據(jù)對(duì)象。如變量、數(shù)組元素、結(jié)構(gòu)成員、引用和解除引用的指針等。
?。?)、非左值,包括字面常量和包含多項(xiàng)的表達(dá)式。
?。?)、常規(guī)變量屬于可修改的左值,const變量屬于不可修改的左值。
23、右值引用——可指向右值的引用,使用&&聲明。如: double & rref = std::sqrt ( 26.00 ) ;
24、默認(rèn)參數(shù)——通過(guò)函數(shù)原型設(shè)置函數(shù)參數(shù)默認(rèn)值。
?。?)、必須從右到左添加默認(rèn)值。
(2)、實(shí)參按照從左到右的順序依次被賦值給形參,而不能跳過(guò)任何參數(shù)。
25、函數(shù)重載——參數(shù)列表(特征標(biāo))不同,而函數(shù)名相同的函數(shù)。
?。?)、類型引用和類型本身被視為同一個(gè)特征標(biāo)。
(2)、不能把const變量賦值給非const形參
26、名稱修飾——根據(jù)函數(shù)原型中指定的形參類型對(duì)每個(gè)函數(shù)名進(jìn)行加密,用來(lái)跟蹤每一個(gè)重載函數(shù)。
27、函數(shù)模板——相當(dāng)于Java中的泛型
(1)、聲明: template <typename T> void Swap(T &a, T &b); // typeName 可用 class 替換
(2)、函數(shù)模板不能縮短可執(zhí)行程序,最終的代碼不包含任何模板,只包含了為程序生成的實(shí)際函數(shù)。
?。?)、一般將模板放在頭文件中。
28、顯式具體化——具體化的函數(shù)定義,匹配時(shí),使用它而不是模板。
(1)、非模板函數(shù): void swap( job &, job &);
?。?)、模板函數(shù): template <typeName T> void swap( T & ,T &);
(3)、顯式具體化: template<> void swap<job>( job &, job &); // swap<job>中job是可選的
?。?)、編譯器在選擇原型時(shí): 非模板函數(shù) > 顯式具體化 > 模板函數(shù)
?。?)、顯式實(shí)例化: template void swap<int> ( int, int); // template后無(wú)<>
(6)、隱式實(shí)例化: 對(duì)于模板函數(shù),編譯器會(huì)通過(guò)對(duì)這個(gè)模板含數(shù)的引用生成一個(gè)含數(shù)的實(shí)例,這通常叫隱式實(shí)例化
29、decltype——decltype( expression ) var; // 讓var的類型與expression一樣。
?。ㄗ⒁?!若expression是一個(gè)函數(shù)調(diào)用,var的類型與其返回值相同。若expression是一個(gè)左值,var為指向其類型的引用)
30、后置返回類型——給函數(shù)指定返回類型。
如:template<class T1, class T2> auto gt( T1 x, T2 y) -> decltype( x + y ) { ... return x + y ;}
相關(guān)文章
C++中內(nèi)存池和內(nèi)存分配區(qū)Arena概念詳解
在 C++ 中,內(nèi)存分配區(qū)(Arena)通常指的是預(yù)先分配的一大塊連續(xù)內(nèi)存空間,這種方法的主要目的是提高內(nèi)存分配和釋放的效率,下面就跟隨小編一起了解一下C++中內(nèi)存池和內(nèi)存分配區(qū)Arena相關(guān)概念吧2023-12-12C++語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)五子棋
這篇文章主要為大家詳細(xì)介紹了C++語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)五子棋,包括數(shù)據(jù)結(jié)構(gòu)和對(duì)象設(shè)計(jì)及主函數(shù)調(diào)用實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試問(wèn)題
這篇文章主要介紹了C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09C++ 中使用lambda代替 unique_ptr 的Deleter的方法
這篇文章主要介紹了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以參考下2017-04-04C++中fstream,ifstream及ofstream用法淺析
這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下2014-08-08解析C/C++?Capstone?引擎源碼編譯問(wèn)題
Capstone的編譯非常簡(jiǎn)單只需要一步即可輕松得到對(duì)應(yīng)的Lib庫(kù)文件,如下將介紹該引擎如何被編譯,以及簡(jiǎn)單的測(cè)試編譯,這篇文章主要介紹了C/C++?Capstone?引擎源碼編譯,需要的朋友可以參考下2022-09-09關(guān)于memcpy和memmove的一點(diǎn)重要說(shuō)明
下面小編就為大家?guī)?lái)一篇關(guān)于memcpy和memmove的一點(diǎn)重要說(shuō)明。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12在Visual Studio中用C++語(yǔ)言創(chuàng)建DLL動(dòng)態(tài)鏈接庫(kù)圖文教程
這篇文章主要介紹了在Visual Studio中用C++語(yǔ)言創(chuàng)建DLL動(dòng)態(tài)鏈接庫(kù)圖文教程,本文詳細(xì)講解了DLL庫(kù)的創(chuàng)建過(guò)程,并給出了代碼示例,需要的朋友可以參考下2014-09-09