《C++ primer plus》讀書(shū)筆記(三)
第九章
1、C++程序的組成——
?。?)、頭文件: 包含結(jié)構(gòu)聲明和使用這些結(jié)構(gòu)的原型。
?。?)、源代碼文件: 包含與結(jié)構(gòu)有關(guān)的函數(shù)的代碼。
(3)、源代碼文件: 包含調(diào)用與結(jié)構(gòu)有關(guān)的函數(shù)的代碼。
2、頭文件——
(1)、常包含的內(nèi)容: 函數(shù)原型;#define或const定義的符號(hào)常量;結(jié)構(gòu)聲明;類聲明;模板聲明;內(nèi)聯(lián)函數(shù)。
?。?)、若文件名包含在尖括號(hào)中,編譯器將在存儲(chǔ)標(biāo)準(zhǔn)頭文件的主機(jī)系統(tǒng)的文件系統(tǒng)中查找。
(3)、若文件名包含在雙引號(hào)中,編譯器首先查找當(dāng)前的工作目錄或源代碼目錄,再在標(biāo)準(zhǔn)位置查找。
?。?)、同一個(gè)文件中只能將同一個(gè)頭文件包含一次。用來(lái)忽略除第一次包含之外的所有內(nèi)容。
頭文件coordin.h中,常使用: #ifndef COORDIN_H_ define COORDIN_H_ /*頭文件內(nèi)容*/ #endif
3、編譯過(guò)程——
?。?)、命令: CC file1.cpp file2.cpp
?。?)、預(yù)處理器將包含的文件(頭文件之類的)和源代碼合并。生成臨時(shí)文件temp1.cpp和temp2.cpp
?。?)、編譯器創(chuàng)建每個(gè)源代碼文件的目標(biāo)代碼文件:file1.o和file2.o
?。?)、鏈接程序?qū)⒛繕?biāo)代碼文件、庫(kù)代碼和啟動(dòng)代碼合并,生成可執(zhí)行文件:a.out
(注意!鏈接編譯模塊的時(shí)候,請(qǐng)確保所有對(duì)象文件和庫(kù)都是同一個(gè)編譯器生成的。)
4、存儲(chǔ)持續(xù)性——自動(dòng)存儲(chǔ)持續(xù)性、靜態(tài)存儲(chǔ)持續(xù)性、線程存儲(chǔ)持續(xù)性(C++11)、動(dòng)態(tài)存儲(chǔ)持續(xù)性。
5、?!獥V械臄?shù)據(jù)在相鄰的內(nèi)存單元中
?。?)、使用2個(gè)指針跟蹤棧,一個(gè)指向棧底(棧的開(kāi)始位置),一個(gè)指向棧頂(下一個(gè)可用內(nèi)存單元)
?。?)、新值沒(méi)有被刪除,但不再被標(biāo)記。
6、鏈接性——
?。?)、外部鏈接性,可在其他文件中訪問(wèn)。如: 函數(shù)外,不使用staitic定義的變量
?。?)、內(nèi)部鏈接性,只能在當(dāng)前文件中訪問(wèn)。如: 函數(shù)外,使用static定義的變量
?。?)、無(wú)鏈接性,只能在當(dāng)前函數(shù)或代碼塊中訪問(wèn)。如: 代碼塊中定義的變量
?。ㄗ⒁猓∷械撵o態(tài)變量都會(huì)首先被零初始化,然后再選擇動(dòng)態(tài)、靜態(tài)初始化。)
7、變量聲明——
單定義規(guī)則 -> 變量只能有一次定義
?。?)、定義聲明(定義):給變量分配存儲(chǔ)空間。
?。?)、引用聲明(聲明):不分配空間,引用已有的變量。使用關(guān)鍵字extern,且不進(jìn)行初始化。
?。ㄗ⒁猓∫诙鄠€(gè)文件中使用外部變量,應(yīng)在一個(gè)文件中定義,其他文件中使用extern聲明。)
?。ㄊ褂胑xtern可以覆蓋變量默認(rèn)的內(nèi)部鏈接性,使其變成外部的)
8、const char * const a[12] = { “a”,"b","c"... }; // 第一個(gè)const防止字符串被修改,第二個(gè)const確保數(shù)組中每個(gè)指針指向它最初指向的字符串。
這個(gè)指針的類型是 char * [12],即char類型的指針的數(shù)組,數(shù)組大小為12。第一個(gè)const修飾char *,第二個(gè)const修飾a[12]。所以。
9、說(shuō)明符和限定符——
(1)、關(guān)鍵字thread_local: 指出變量的持續(xù)性和其所屬的持續(xù)性相同。
(2)、const: 內(nèi)存被初始化后,程序不能對(duì)它修改。const全局變量的鏈接性為內(nèi)部的。
?。?)、volatile: 每次都取值,不允許取值優(yōu)化。
?。?)、mutable: 即使結(jié)構(gòu)(或類)變量為const,某個(gè)被mutable修飾的成員也可以被修改。
10、函數(shù)的鏈接性——所有函數(shù)的存儲(chǔ)持續(xù)性都自動(dòng)為靜態(tài)的,鏈接性是外部的??梢允褂胹tatic在原型和定義中將鏈接性設(shè)置為內(nèi)部的。
11、使用new初始化——
int a = new int(5); //設(shè)置a的值為5. 比較之下,大括號(hào)初始化更方便和通用。
(new找不到請(qǐng)求的內(nèi)存量、失敗時(shí),將引發(fā)異常std::bad_alloc)
?。?)、運(yùn)算符new實(shí)際上調(diào)用void * operator new ( std::size_t );
(2)、運(yùn)算符new[] 實(shí)際上調(diào)用void * operator new[] ( std::size_t ); //這里std::size_t實(shí)際上是一個(gè)別名typedef,對(duì)應(yīng)合適的整型。
12、定位new運(yùn)算符——
能指定要使用的內(nèi)存位置。不跟蹤哪些內(nèi)存單元未使用,也不查找未使用的內(nèi)存塊。
?。?)如:#include <new> char buffer[50]; struct1 * s = new (buffer) struct1; //從buffer中分配struct1大小的內(nèi)存。
13、名稱空間——
相當(dāng)于Java中的package,不過(guò)也有很多不同。
?。?)、名稱空間可以是全局的,也可以位于另一個(gè)名稱空間中。
?。?)、默認(rèn)情況下,名稱空間中聲明的名稱的鏈接性是外部的。
?。?)、全局名稱空間,對(duì)應(yīng)文件級(jí)聲明區(qū)域,全局變量位于此處。
(4)、名稱空間是開(kāi)放的,即可以將某些名稱添加到已有的名稱空間中,如: namespace qsk { char * name(const char* ); } //將這個(gè)名稱添加到qsk中。
?。?)、通過(guò)作用域運(yùn)算符來(lái)限定各名稱,如: cout << qsk::name << endl;
14、using聲明和using編譯指令——
?。?)、using聲明使得特定的標(biāo)識(shí)符可用。(無(wú)須限定名稱,直接使用)如: using std::cout;
?。?)、using編譯指令使得整個(gè)名稱空間可用。(多了一個(gè)namespace)如: using namespace std;
(注意,不要在頭文件中使用using編譯指令。對(duì)于using聲明,首選將其作用域設(shè)置為局部而不是全局。)
第十章
15、類——
(1)、類成員可以是數(shù)據(jù)也可以是函數(shù)。類聲明時(shí),用訪問(wèn)控制符來(lái)修飾。
?。?)、定義成員函數(shù)時(shí),使用作用域解析運(yùn)算符(::)來(lái)表示函數(shù)所屬的類。如 void Stock::update(double price){}
?。ㄋ梢栽L問(wèn)類的私有成員)
?。?)、定義位于類聲明中的函數(shù),自動(dòng)成為內(nèi)聯(lián)函數(shù)。
?。?)、也可以在類外使函數(shù)成為內(nèi)聯(lián)函數(shù),只需要在類實(shí)現(xiàn)中使用 inline 限定符,如: inline void Stock::update(double price){}
?。?)、創(chuàng)建對(duì)象,如: Stock a,b; 也可以使用new為對(duì)象分配存儲(chǔ)空間。如: Stock a = new Stock;
?。?)、通過(guò)成員運(yùn)算符來(lái)使用成員函數(shù),如: a.show();
?。?)、所創(chuàng)建的每一個(gè)對(duì)象都有自己的存儲(chǔ)空間,用于存儲(chǔ)其內(nèi)部變量和類成員;所有對(duì)象公用一組類方法?!?
16、訪問(wèn)控制——private、public、protected
不必在類聲明中使用關(guān)鍵字private,它是類的默認(rèn)訪問(wèn)控制。
?。ㄗ⒁猓++中,結(jié)構(gòu)具有與類相同的特性,不過(guò)結(jié)構(gòu)的默認(rèn)訪問(wèn)類型是public。)
17、類設(shè)計(jì)——
(1)、提供類聲明。
?。?)、實(shí)現(xiàn)類成員函數(shù)。通常單獨(dú)提供函數(shù)定義,通過(guò)(::)來(lái)制定函數(shù)屬于哪個(gè)類。
18、類的構(gòu)造函數(shù)——
專門(mén)用于構(gòu)造新對(duì)象、將值賦予它們的數(shù)據(jù)成員。
?。?)、構(gòu)造函數(shù)的原型和函數(shù)頭沒(méi)有返回值,而且沒(méi)有被聲明為void類型。構(gòu)造函數(shù)沒(méi)有聲明類型。
?。?)、構(gòu)造函數(shù)的參數(shù)表示的不是類成員,而是賦予他們的值,因此參數(shù)名不能與類成員相同。(與Java不同)
(常見(jiàn)的做法是在數(shù)據(jù)成員名使用m_前綴,或使用后綴_)
19、使用構(gòu)造函數(shù)——
?。?)、隱式調(diào)用: Stock s( "a", 22, 1.2); 或 Stock a;
?。?)、顯式調(diào)用: Stock s = Stock( "a", 22, 1.2);
?。ㄗ⒁?,構(gòu)造函數(shù)的其他特征與Java類似。)
20、析構(gòu)函數(shù)——對(duì)象過(guò)期時(shí),程序自動(dòng)調(diào)用的成員函數(shù),用以完成清理工作。如: ~Stock();
?。ㄗ⒁?!如果對(duì)象通過(guò)new創(chuàng)建的,使用delete釋放內(nèi)存時(shí),其析構(gòu)函數(shù)被自動(dòng)調(diào)用。)
21、對(duì)象賦值——默認(rèn)情況下,一個(gè)對(duì)象賦值給同類型的另一對(duì)象時(shí),會(huì)將源對(duì)象中每個(gè)數(shù)據(jù)成員的內(nèi)容復(fù)制給目標(biāo)對(duì)象。
(1)、初始化方式: Stock s = Stock("a", 22, 1.2); //可能創(chuàng)建臨時(shí)變量。
?。?)、賦值方式: s1 = Stock("a", 22, 1.2); //總會(huì)在賦值前創(chuàng)建一個(gè)臨時(shí)變量。并且會(huì)自動(dòng)為臨時(shí)變量調(diào)用析構(gòu)函數(shù)。
22、const成員函數(shù)——確定不修改對(duì)象的類方法。const關(guān)鍵字放在函數(shù)括號(hào)后面,如: void stock:: show() const;
23、C++11列表初始化——對(duì)于Stock jock {"abcd"}將匹配Stock::Stock(const std::string & co, long n = 0,double pr = 0.0);
而對(duì)于Stock c {};將匹配默認(rèn)構(gòu)造函數(shù)。
24、this指針——類方法中使用,this指針指向調(diào)用對(duì)象,為調(diào)用類方法的對(duì)象的地址。如需引用整個(gè)調(diào)用對(duì)象,可以使用*this。
25、對(duì)象數(shù)組——如: Stock s[4] = {Stock("a", 22, 1.2), Stock(), Stock("a", 22, 1.2)};
//這里首先使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建數(shù)組元素,然后花括號(hào)中的構(gòu)造函數(shù)創(chuàng)建臨時(shí)對(duì)象,然后臨時(shí)對(duì)象的內(nèi)容被復(fù)制到相應(yīng)元素中
?。ㄗ⒁?!創(chuàng)建類對(duì)象數(shù)組,這個(gè)類必須有默認(rèn)構(gòu)造函數(shù)。)
26、作用域?yàn)轭惖某A俊?/p>
?。?)、類中聲明的枚舉,作用域?yàn)檎麄€(gè)類,不屬于對(duì)象,而是屬于類。
(2)、使用關(guān)鍵字static修飾的常量將被放在靜態(tài)存儲(chǔ)區(qū)域,不屬于對(duì)象。
27、新枚舉——enum class 或 enum struct
(1)、枚舉量的作用域?yàn)轭?。需要用枚舉名類限定枚舉量。
(2)、常規(guī)枚舉自動(dòng)轉(zhuǎn)換為整型,但作用域內(nèi)枚舉不能隱式轉(zhuǎn)換為整型。不過(guò)可以顯式轉(zhuǎn)換。
?。?)、新枚舉的底層類型為int,不過(guò)也可以指定底層類型,如: enum class : short pizza { a, b, c, d};
28、小結(jié)——
(1)、類將數(shù)據(jù)和方法組合成一個(gè)單元,其私有性實(shí)現(xiàn)數(shù)據(jù)隱藏。類是用戶定義的類型,對(duì)象是類的實(shí)例。
(2)、類聲明應(yīng)放在頭文件中,定義成員函數(shù)的源代碼應(yīng)放在方法文件中。
?。?)、每個(gè)對(duì)象都存儲(chǔ)自己的數(shù)據(jù)而共享類方法。
?。?)、抽象數(shù)據(jù)類型(Abstract Data Type)——ADT
欄 目:C語(yǔ)言
下一篇:C++判斷pe文件實(shí)例
本文標(biāo)題:《C++ primer plus》讀書(shū)筆記(三)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3245.html
您可能感興趣的文章
- 01-10shared_ptr線程安全性全面分析
- 01-10C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法
- 01-10C++變位詞問(wèn)題分析
- 01-10《C++ primer plus》讀書(shū)筆記(二)
- 01-10《C++ primer plus》讀書(shū)筆記(一)
- 01-10常用的STL查找算法
- 01-10C++智能指針讀書(shū)筆記
- 01-10淺談c++ stl迭代器失效的問(wèn)題
- 01-10有關(guān)C++頭文件的包含順序研究


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改