Effective C 讓自己習慣C

2022-03-09 22:48:16 字數 2295 閱讀 6141

c++的四個語言層次:

c:c++是以c為基礎的。基本資料型別、語句、預處理器、陣列、指標等統統來自c。

oject-oriented c++:物件導向這一特性包含了:類,封裝(宣告與實現相分離),繼承(多繼承和多重繼承、建構函式、析構函式、拷貝建構函式、拷貝賦值運算子),多型(靜態繫結:函式過載,動態繫結:虛函式),虛函式等

template c++:c++的泛型程式設計能力。

stl:乙個標準的template庫,裡面介紹了容器、迭代器、演算法以及函式物件等模板類和模板函式。

綜述:c++並不是乙個帶有一組守則的一體語言:它是從四個次語言組成的聯綁**,每個次語言都有自己的規約。

對於單純常量,最好以const物件或enums替換#define。

對於形似函式的巨集,最好改用inline函式替換#define

stl的迭代器是以指標為根據塑模出來,所以迭代器的作用就像個t*的指標。宣告迭代器為const就像宣告指標為const一樣(即宣告乙個t*const指標),表示這個迭代器不得指向不同的東西,但它所指的東西的值是可以改動的。如果希望迭代器所指的東西是不可被改動的,需要的是const_iterator。

vectorvec; 

const vector::iterator =vec.begin();

*iter = 10; //沒問題,改變iter所指物

++iter; //錯誤!iter是const

vector::const_iterator citer =vec.begin();

*citer = 10; //錯誤!*citer是const

++citer; //沒問題,改變citer

請記住

類的建構函式的次序是先執行建構函式初始化列表,初始化所有成員變數,然後再執行建構函式體,建構函式體內的成員賦值已經不屬於初始化的範疇,成員都是用拷貝賦值。

如果類沒有初始化列表,則類會先執行預設建構函式,構造出所有成員變數後,再執行函式體內的拷貝賦值。

c++類的成員初始化是有著明顯的次序的,一般是基類的成員先初始化,然後派生類的成員按定義的順序初始化。所以類的建構函式初始化列表上的初始化順序跟類真實的成員初始化順序是沒有關係的。

「不同編譯單元內定義之non-local static物件」

static物件,其壽命從被構造出來直到程式結束為止。

函式內的static物件稱為local static物件(因為它們對函式而言是local),其他static物件稱為non-local static物件。程式結束時static物件會被自動銷毀,也就是它們的析構函式會在main()結束時被自動呼叫。

當我們的某個編譯單元內的某個non-local static物件的初始化動作使用了另一編譯單元的某個non-local static物件,它所用到的這個物件可以尚未被初始化。c++關於定義於不同編譯單元內的non-local static物件的初始化次序並無明確定義。

比如在a.cpp裡我們定義乙個類,乙個該類的物件

classfilesystem 

; extern filesystem tfs;

現在同乙個專案下的b.cpp檔案中有乙個類,類建構函式用到了tfs物件。

classdirectory 

; directory::directory(params)

現在如果我們建立了乙個directory物件

directory tempdir(params);

上面的**就可能會出問題,除非能保證tfs在tempdir之前先初始化,否則tempdir的建構函式會用到尚未初始化的tfs。

解決方案:

c++保證,函式內的local static物件會在該函式被呼叫期間,首次遇到該物件的定義的時候被初始化。

所以如我們把tfs和tempdir設計為乙個函式,函式返回該類的乙個static物件引用就可以解決問題了。

所以我們可以改寫上面的**:

filesystem&tfs() 

directory&tempdir()

請記住

effective c 讓自己習慣c

一 忠告 a 對於常量,用const和 enum 代替define b 對於形似函式,用inline代替 define 二 盡量替換掉define的原因 a define a 1.63出錯時,報 1.63 出錯 const int a 1.63 出錯時,報 a出錯。顯然報變數名出錯更加容易除錯 b ...

《Effective C 》之讓自己習慣 C

目錄 條款1 視c 為乙個語言聯盟 條款2 盡量以 const enum inline 替換 define 條款3 盡可能使用 const 條款4 確定物件使用前已先被初始化 1 c 分為四個次語言,c object oriented c template c stl。2 四個語言都有自己的規約,使...

讓自己習慣c

c 是個多重范型程式語言,乙個同時支援過程形式 物件導向形式 函式形式 泛型形式 元程式設計形式的語言 1.c 區塊 語句 預處指標等來自於c。2.object oriented c class,封裝 繼承 多型等等 這部分是物件導向設計之古典守則在c 上最直接的實施。3.template c 這部...