(一)【忠告】
a) 對於常量,用const和enum
代替define
b) 對於形似函式,用inline代替(二)盡量替換掉define的原因:define
a) define a 1.63出錯時,報1.63
出錯;const int a=1.63
出錯時,報
a出錯。顯然報變數名出錯更加容易除錯
b) define的可見範圍不可控制,(三)常量替換define的兩種特殊情況:const
修飾的常量可以被類封裝
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) 使用示例
intmain();
cout<
cout << test << endl;}(一)【忠告】
a) const可以被用來修飾任何作用域內的物件、變數(成員變數)、函式返回值(成員函式返回值)、函式引數(成員函式引數)、函式本身(成員函式本身)
b) 有些東西(比如返回值)宣告為const,更容易排錯
c) 可以使用mutable來釋放編譯器的bitwise-constness
d) 當const和(二)const與指標non-const
的實現沒有什麼區別時,可以用
non-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 這部...