effective c 讓自己習慣c

2021-07-24 11:44:38 字數 4406 閱讀 5947

(一)【忠告】

a) 對於常量,用const和

enum

代替define

b) 對於形似函式,用inline代替

define

(二)盡量替換掉define的原因:

a) define a 1.63出錯時,報

1.63

出錯;const int a=1.63

出錯時,報

a出錯。顯然報變數名出錯更加容易除錯

b) define的可見範圍不可控制,

const

修飾的常量可以被類封裝

(三)常量替換define的兩種特殊情況:

a) 當常量定義成指標時,要有兩個const,即

const int* const a=10;

前乙個const

保證了指標

a指向位址的內容不會發生變化,後乙個

const

保證了指標

a是個常量指標(

*const a

b) class的專屬常量

i. class aaa;

支援靜態變數內初始化的編譯器可以這麼幹。

ii. class aaa;

aaa::num=10;

不支援內初始化的編譯器只能這麼幹,但這時候,data陣列就不知道大小,編譯會出錯

iii. class;

data[num];};

列舉中的常量可以被類成員直接引用。這樣就避免了不支援靜態變數初始化的編譯器,無法實現上述做法的問題。並且enum不會被取到常量位址,如果不想被取到常量位址,也可以這麼做。

(四)補習列舉型別enum:

a) 定義enum luo;

b) luo是像

int那樣的型別名。

enum luo中的a

,b,c

都是常量,且在程式中可以直接使用

a來表示』a』。enum的大小為

4位元組,由編譯器決定,不以常量個數而變化。

c) 使用示例

int

main();

cout<
cout << test << endl;}

(一)【忠告】

a) const可以被用來修飾任何作用域內的物件、變數(成員變數)、函式返回值(成員函式返回值)、函式引數(成員函式引數)、函式本身(成員函式本身)

b) 有些東西(比如返回值)宣告為const,更容易排錯

c) 可以使用mutable來釋放編譯器的

bitwise-constness

d) 當const和

non-const

的實現沒有什麼區別時,可以用

non-const

來呼叫const

的方法,使**復用

(二)const與指標

a) const int *a、

const * int a

、int * const a

i. const在

*的右邊:表示指標

a本身不是常量,指標

a指向的位址可變,但位址中的內容物不可變

ii. const在

*的左邊:表示指標

a本身是常量,指標

a指向的位址不可變,但位址中的內容物可變

b) 指標作為全域性變數,放在標頭檔案中時

i. 用const int * const a=5;表示指標指向位址不可變,且位址中的內容物亦不可變

(三)const與迭代器

a) const vector::iterator it:表示迭代器本身是常量,不允許

++it

b) vector::const_iterator it:表示迭代器所指向的位址內容不允許改變

(四)const與類

a) const修飾物件

i. const物件被限制為只能呼叫

const

修飾的成員函式,因為

non-const

可能會改變物件的值

b) const修飾成員變數

i. 和const修飾普通變數一樣

c) const修飾成員函式的引數

i. 和const修飾普通變數一樣

d) const修飾成員函式返回值

i.可以幫助編譯器排錯:if(a*b=c)//

經常少打乙個

=,當非

const

時,且a和b

均為某函式的返回值(物件),這個賦值動作就會被執行。但如果是

const

的話,那麼因為常量不可被賦值,所以會報錯,更容易排錯了

ii.如果函式返回值採用「值傳遞方式」【非引用,非指標】,由於函式會把返回值複製到外部臨時的儲存單元中,加const修飾沒有任何價值。所以,對於值傳遞來說,加

const

沒有太多意義。

e) const修飾成員函式本身

i.成員函式可以憑藉有無const修飾來過載

。const乙個版本、

non-const

又是另乙個版本

ii. const修飾成員函式,該成員函式不能更改任何

non-static

的成員變數,但可以使用

mutable

(修飾成員變數)來打破這個限制

iii. 當const和

non-const

成員函式相同時,

non-const

版呼叫const

版可以**復用

(一)【忠告

a) 內建型別需要手工初始化。

b) 其他型別初始化,由建構函式承擔。

i. 建構函式初始化最好用初始化列表。比起在建構函式中在賦實參值初始化,初始化列表1.成員變數不用先被賦上隨機值;

2.實參賦值給成員變數又是一次

copy;3.

形參到實參又是一次拷貝

ii. 初始化列表初始化順序至於成員變數的宣告順序有關。

iii. const和

reference定義時需要初始化的成員變數,需要在

初始化列表中初始化。

static

需要在類體外初始化(如果編譯器支援內初始化,那麼可以在定義時就初始化)

Effective C 讓自己習慣C

c 的四個語言層次 c c 是以c為基礎的。基本資料型別 語句 預處理器 陣列 指標等統統來自c。oject oriented c 物件導向這一特性包含了 類,封裝 宣告與實現相分離 繼承 多繼承和多重繼承 建構函式 析構函式 拷貝建構函式 拷貝賦值運算子 多型 靜態繫結 函式過載,動態繫結 虛函式...

《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 這部...