《C++ primer plus》讀書筆記(一)
第一章
1、預(yù)處理器——#include<iostream>將iostream文件內(nèi)容添加到程序中。老式C頭文件保留了擴展名.h,而C++頭文件沒有擴展名。
(有些C頭文件被轉(zhuǎn)換為C++頭文件,去掉擴展名,并在前面加c,如cmath)
2、名稱空間——相當(dāng)于Java中的package,using編譯指令相當(dāng)于Java中的import。頭文件沒有.h前綴時,類、函數(shù)和變量是C++編譯器的標(biāo)準(zhǔn)組件,被放置在名稱空間std中。
3、類的本質(zhì)——類是用戶定義的一種數(shù)據(jù)類型。類定義描述的是數(shù)據(jù)格式及其用法,而對象則是根據(jù)數(shù)據(jù)格式規(guī)范創(chuàng)建的實體。
4、main()——main()的返回值(退出值)是返回給操作系統(tǒng)。通常退出值為0意味著程序運行成功。
第二章
5、OOP——面向?qū)ο缶幊痰谋举|(zhì)是設(shè)計并擴展自己的數(shù)據(jù)類型,讓類型和數(shù)據(jù)匹配。
6、標(biāo)識符——以一個下劃線開頭的名稱被保留給實現(xiàn),作全局標(biāo)識符;以兩個下劃線或下劃線加大寫字母的名稱被保留給實現(xiàn)(編譯器及其使用的資源)使用。
(C++對名稱長度沒有限制)
7、整型——short至少16位;int至少和short一樣;long至少32位,且至少和int一樣長;long long至少64位,且至少和long一樣長。
8、字節(jié)——字節(jié)通常指8位的內(nèi)存單元,而C++中的字節(jié)依賴于實現(xiàn)。
9、運算符——運算符是內(nèi)置的語言元素。sizeof運算符返回類型或變量的長度(字節(jié))。所以,不同系統(tǒng)中sizeof( int )的返回值可能不同。
10、頭文件climits——定義了各種表示類型限制的符號常量。如:#define INT_MAX 32767。(被設(shè)計為C可用的頭文件,符號常量必須用#define編譯指令定義)
11、變量初始化——
函數(shù)內(nèi)部定義的變量,應(yīng)該在定義的時候進行初始化,否則它的值是不確定的,為被創(chuàng)建前相應(yīng)的內(nèi)存單元保存的值。
(1)、int a = 1; // 傳統(tǒng)的C初始化
(2)、int b(2); // C++的新方式
(3)、int c = {3} 或 int c{3} // C++的大括號初始化器用于任何類型(大括號內(nèi)不包含任何東西時,變量的初始化為0)
12、int——計算機處理起來效率最高的長度。除非使用后綴或值太大,C++通常將整形常量存儲為int類型。
13、wcha_t——是整形類型,有足夠的空間表示系統(tǒng)使用的最大擴展字符集。使用 iostream 中的 wcin 和 wcout 處理wcha_t流。
可以通過前綴L來指示寬字符常量和寬字符串,如 wcha_t a = L'p'; wcout << L"tall" << endl;
(C++11新增類型 char16_t 和 char32_t ,都是無符號的,分別長16位和32位,使用前綴 u 表示前者,前綴 U 表示后者)
14、bool——C++將0解釋為 false ,將非零解釋為 true 。
15、const——創(chuàng)建常量時最好馬上賦值,如cont int a = 5;常量通常將首字母大寫。
16、浮點——float至少32位;double至少48位,且不少于float;long double 至少和double一樣多。這三種類型的指數(shù)范圍至少是-37-37。
(1)、cout.setf()可以控制輸出格式,迫使cout使用定點表示法。因為cout通常會刪除浮點后面的0,如3.3300000顯示為3.33。
?。?)、浮點常量通常為double類型,通常用后綴f或F指定float類型,用后綴l或L指定long double類型。
17、強制類型轉(zhuǎn)換——
如:(long) thorn 或 long(thorn)
強制類型轉(zhuǎn)換不會修改thorn本身,而是創(chuàng)建一個新的、指定類型的值。
也可以這樣: static_cast<long> (thorn) ,它比傳統(tǒng)的強制類型轉(zhuǎn)換更為嚴(yán)格。
18、auto——自動推斷類型,關(guān)鍵字auto可以不指定變量的類型,編譯器自動把變量的類型設(shè)置成與初始值相同,如 auto a = 100;
不過,auto一般是用于處理復(fù)雜類型
第四章
19、數(shù)組——
?。?)、聲明數(shù)組的通用格式: typeName arrayName[arraySize] ,如 int a[5];
?。ň幾g器不會檢查使用的下標(biāo)是否有效。)
?。?)、如果沒有初始化函數(shù)中定義的數(shù)組,其元素的值為以前駐留在該內(nèi)存中的值。(與函數(shù)中的變量一樣)
?。?)、sizeof 作用與數(shù)組名時,得到的是整個數(shù)組中的字節(jié)數(shù)。作用于元素時,得到的是該元素的字節(jié)數(shù)。
?。?)、只有定義數(shù)組時才能初始化,之后就不行了??梢圆糠殖跏蓟纾篿nt a[5] = {1,2},部分初始化時,編譯器把其他元素設(shè)置為0。
可以這樣: int b[] = {1,2,3,4,5}; 讓編譯器計算元素個數(shù)。
?。?)、使用列表初始化數(shù)組時,可以省略等號(=);大括號內(nèi)不包含任何內(nèi)容時,默認(rèn)所有元素為0;列表初始化禁止縮窄轉(zhuǎn)換。
20、字符串——
字符串是存儲在內(nèi)存的連續(xù)字節(jié)中的一系列字符。
?。?)、C-風(fēng)格的字符串以空字符結(jié)尾,其ASCII碼為0,如: char dog[7] = {'a','b','c','d','e','f','\0'}; 注意,數(shù)組長度必須計算‘\0'
?。?)、字符串常量,如: char cat[] = "cat";
?。ㄗ⒁?!'S'代表字符常量,而"S"表示‘S'和‘\0'兩個字符組成的字符串,“S”實際表示的是字符串所在的內(nèi)存地址)
?。?)、拼接字符串時,第一個字符串最后的‘\0'會被第二個字符串的第一個字符取代。
?。?)、strlen()函數(shù)返回存儲在數(shù)組中的字符串的長度,只包括可見的字符,不包括空字符?! ?/p>
?。?)、cin使用空白(空格、制表符和換行符)來確定字符串的結(jié)束位置,所以它讀取數(shù)組輸入時,只讀取第一個單詞,并自動添加空字符。
?。?)、面向行的輸入有g(shù)etline()和get(),它們都通過換行符來確定輸入結(jié)尾,不同的是,get()并不再讀取并丟棄換行符。
cin.getline(name,ArSize),將讀取ArSize-1個字符到name數(shù)組中。對于get(),可以這樣使用: cin.get(name,ArSize).get();
?。?)、讀取空行時,get()將設(shè)置失效位;如果輸入行包含的字符數(shù)比指定的多,getline()會設(shè)置失效位。后面的輸入將被阻斷。
?。?)、允許:char c[] = {"hello world!"};
?。?)、string類具有自動調(diào)整大小的功能,因此更為安全。
?。?0)、strcpy(str1,str2)將str2復(fù)制給str1, strcat(str1,str2)將str2附加到str1的結(jié)尾。
?。?1)、str1.size()和strlen(str1)的功能相同。前者是string類的一個方法,后者是一個常規(guī)函數(shù)。
21、原始(raw)字符串——原始字符串中,\n不表示換行符,如: 默認(rèn)定界符 ( 和 ) cout << R"(don't use "\n" ,OK?)" << '\n'; 輸出:don't use "\n" ,OK?
自定義定界符 +*( 和 )+* cout << R"+*("(don't use "\n" ,OK?)")+*" << '\n'; 輸出:"(don't use "\n" ,OK)"
22、結(jié)構(gòu)——
?。?)、定義: struct man { char name[20]; double weight; int age; };
?。?)、聲明,允許省略關(guān)鍵字struct,如: man mike;
?。?)、初始化: man mike {"mike", 56.2, 22};
?。?)、使用成員運算符(.)來訪問各個成員。
?。?)、同時定義結(jié)構(gòu)和創(chuàng)建變量: struct man { char name[20]; double weight; int age; } mike = {"mike", 56.2, 22}, jim ;
?。?)、還可以聲明匿名結(jié)構(gòu): struct { int x, int y } point ;
23、結(jié)構(gòu)中的位字段——指定占用特定位數(shù)的結(jié)構(gòu)成員,如: struct my_bit { unsigned int x : 4; bool y : 1; };
24、外部聲明——函數(shù)外部的聲明。C++不提倡使用外部變量,提倡使用外部聲明。
25、共用體——
一種數(shù)據(jù)格式,能夠存儲不同的數(shù)據(jù)類型,但只能同時存儲其中的一種類型,常用于節(jié)省內(nèi)存。如: union id { long long_id ; char char_id; };
?。?)、由于共用體每次只能存儲一個值,其長度為最大成員的長度。
?。?)、匿名共用體沒有名稱,其成員將成為位于相同地址處的變量,每次只有一個成員是當(dāng)前成員。
26、枚舉——
另一種創(chuàng)建符號常量的方式,可以代替const。如: enum spectrum { a , b , c , d , f };
?。?)、默認(rèn)情況下,a、b、c、d 、f 作為符號常量,對應(yīng)0到4。
?。?)、對于枚舉,只定義了賦值運算符,并沒有定義算術(shù)運算。
?。?)、只能將定義枚舉時使用的枚舉量賦給枚舉變量。
?。?)、可以使用賦值運算符顯式設(shè)置枚舉量的值。如: enum bits { first , zero = 0 , two = 200 ,three , four }; //這里three的值為201, first 的值為0
(5)、枚舉的取值范圍。bits的最大值是202,大于它的最小的2的冪為256,所以bits的取值范圍為0—255
?。?)、通過強制類型轉(zhuǎn)換,增加了可賦值給枚舉變量的合法值,只要在取值范圍內(nèi)。如: bits b = bits(240);
27、指針——
指針是一個變量,存儲的是值的地址,而不是值本身。
?。?)、地址運算符(&)可以獲得變量的位置(存儲地址)。
(2)、指針,將地址看作指定的量,將值看作派生量。指針名表示地址。
(3)、*運算符被稱為間接值(解除引用)運算符。用于指針可以得到指針地址存儲的值。
?。?)、聲明: int * a; // *運算符兩邊的空格是可選的 int * b , c; // 創(chuàng)建指針b和int變量c,每一個指針都需要一個*
(5)、初始化: int * a = &b; // 將指針a的值設(shè)為&b
?。?)、一定要在對指針使用解除引用運算符(*)之前,將指針初始化為一個確定的、適當(dāng)?shù)牡刂??! ?/p>
?。?)、將數(shù)字賦值給地址: int * pt = (int * ) 0x8000000;
?。?)、分配內(nèi)存: int *pn = new int; //從堆(heap)或只有存儲區(qū)(free store)的內(nèi)存區(qū)域分配內(nèi)存。
28、數(shù)組——
(1)、編譯時給數(shù)組分配內(nèi)存被稱為靜態(tài)聯(lián)編,程序運行時選擇數(shù)組長度被稱為動態(tài)聯(lián)編。
?。?)、創(chuàng)建動態(tài)數(shù)組: int * p = new int [10]; // p為該元素第一個元素的地址
?。?)、釋放數(shù)組: delete [] p; // 只能釋放new分配的內(nèi)存; 不能delete兩次; 對空指針delete安全; 數(shù)組用delete [] 釋放。
?。?)、不能使用sizeof運算符來確定動態(tài)分配的數(shù)組包含的字節(jié)數(shù)。
?。?)、使用數(shù)組: p[0]為第一個元素,p[1]是第二個?! ?/ C++內(nèi)部使用指針來處理數(shù)組,p[1]被看作 *(p+1)
?。?)、p = p + 1; // 指針變量加1后,增加的量為它指向的類型的字節(jié)數(shù)。
?。?)、多數(shù)情況下C++將數(shù)組名解釋為數(shù)組第一個元素的地址。
(8)、指針和數(shù)組名的區(qū)別: 可以修改指針的值,而數(shù)組名是常量; 對數(shù)組名使用sizeof得到數(shù)組的字節(jié)數(shù),而對指針使用sizeof得到指針的長度。
(9)、short tell[10]; cout << tell; // 數(shù)組名本身為其第一個元素的地址,如:&tell[0] ,即一個2字節(jié)內(nèi)存塊的地址。
cout << &tell; // 輸出的是一個20字節(jié)內(nèi)存塊的地址。
?。?0)、給cout提供一個字符的地址,它將從該字符開始打印,直到遇到空字符為止。
?。?1)、要打印一個指針的地址,必須把這個指針強轉(zhuǎn)成另一種指針類型,如 (int *) p;
29、使用new創(chuàng)建動態(tài)結(jié)構(gòu)——struct1 * s = new struct1; // 此時,結(jié)構(gòu)標(biāo)識符是指針,所以不能使用成員運算符句點(.),
// 只能使用箭頭成員運算符(->)訪問成員或者使用(*s).price 來訪問成員。
30、自動存儲、靜態(tài)存儲和動態(tài)存儲——
?。?)、函數(shù)內(nèi)部定義的常規(guī)變量為自動變量,存儲在棧中,后進先出(LIFO),程序執(zhí)行中,不斷增大縮小。為自動存儲。
(2)、在函數(shù)外面定義,或聲明變量使用static關(guān)鍵字的變量為靜態(tài)變量。靜態(tài)存儲是整個程序執(zhí)行期都存在的變量。
(3)、使用new創(chuàng)建的變量為動態(tài)存儲。new和delete管理類一個內(nèi)存池,被稱為free store 或 heap。
?。ㄗ⒁?!棧中自動添加和刪除機制使得占用的內(nèi)存總是連續(xù)的,而new和delete可能導(dǎo)致只有存儲區(qū)不連續(xù))
31、模板類vector——類似string,也是一種動態(tài)數(shù)組,是使用new創(chuàng)建動態(tài)數(shù)組的替代品,自動使用new和delete管理內(nèi)存。
#include<vector> using namespace std; // 包含頭文件,vector位于std名稱空間中
vector<int> ele(10); // 創(chuàng)建一個名為ele的vector對象,可存儲10個類型為int的元素。
?。ㄗ⒁猓珻++11中可用列表初始化。類型可以是變量)
32、模板類array——與數(shù)組一樣,長度固定,使用棧存儲,效率與數(shù)組相同,而更方便、安全。
#include <array> using namespace std; array<int,5> arr; // 名為 arr 的array對象,包含5個int元素。
?。ㄗ⒁猓愋筒荒苁亲兞?!可用列表初始化)
相關(guān)文章
C++函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別
函數(shù)指針是一個指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,這篇文章主要介紹了C++中函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值2022-08-08c++11 符號修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind
這篇文章主要介紹了c++11 符號修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05