Posted on 2009-02-15 10:32
王勇良 閱讀(304)
評(píng)論(0) 編輯 收藏 引用
一 static 產(chǎn)生背景
引出原因:函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時(shí),編譯器為它在棧上分配空間,大家知道,函數(shù)
在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時(shí)會(huì)釋放掉,這樣就產(chǎn)生了一個(gè)問題: 如果想將函數(shù)中此變量的值保存至
下一次調(diào)用時(shí),如何實(shí)現(xiàn)?
最容易想到的方法是定義一個(gè)全局的變量,但定義為一個(gè)全局變量有許多缺點(diǎn),最明顯的缺點(diǎn)是破壞了此變量
的訪問范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)。
類的靜態(tài)成員也是這個(gè)道理。
解決方案:因此C++ 中引入了static,用它來修飾變量,它能夠指示編譯
器將此變量在程序的靜態(tài)存儲(chǔ)區(qū)分配空間保存,這樣即實(shí)現(xiàn)了目的,又使得此變量的存取范圍不變。
2) 具體作用
Static作用分析總結(jié):static總是使得變量或?qū)ο蟮拇鎯?chǔ)形式變成靜態(tài)存儲(chǔ),連接方式變成內(nèi)部連接,對(duì)于局
部變量(已經(jīng)是內(nèi)部連接了),它僅改變其存儲(chǔ)方式;對(duì)于全局變量(已經(jīng)是靜態(tài)存儲(chǔ)了),它僅改變其連接
類型。(1 連接方式:成為內(nèi)部連接;2 存儲(chǔ)形式:存放在靜態(tài)全局存儲(chǔ)區(qū))
二 const 產(chǎn)生背景
a) C++有一個(gè)類型嚴(yán)格的編譯系統(tǒng),這使得C++程序的錯(cuò)誤在編譯階段即可發(fā)現(xiàn)許多,從而使得出錯(cuò)率大為減少
,因此,也成為了C++與C相比,有著突出優(yōu)點(diǎn)的一個(gè)方面。
b) C中很常見的預(yù)處理指令 #define VariableName VariableValue 可以很方便地進(jìn)行值替代,這種值替代至
少在三個(gè)方面優(yōu)點(diǎn)突出:
一是避免了意義模糊的數(shù)字出現(xiàn),使得程序語義流暢清晰,如下例:
#define USER_NUM_MAX 107 這樣就避免了直接使用107帶來的困惑。
二是可以很方便地進(jìn)行參數(shù)的調(diào)整與修改,如上例,當(dāng)人數(shù)由107變?yōu)?01時(shí),改動(dòng)此處即可;
三是提高了程序的執(zhí)行效率,由于使用了預(yù)編譯器進(jìn)行值替代,并不需要為這些常量分配存儲(chǔ)空間,所以執(zhí)行
的效率較高。
然而,預(yù)處理語句雖然有以上的許多優(yōu)點(diǎn),但它有個(gè)比較致命的缺點(diǎn),即,預(yù)處理語
句僅僅只是簡(jiǎn)單值替代,缺乏類型的檢測(cè)機(jī)制。這樣預(yù)處理語句就不能享受C++嚴(yán)
格類型檢查的好處,從而可能成為引發(fā)一系列錯(cuò)誤的隱患。
Const 推出的初始目的,正是為了取代預(yù)編譯指令,消除它的缺點(diǎn),同時(shí)
繼承它的優(yōu)點(diǎn)。
現(xiàn)在它的形式變成了:
Const DataType VariableName = VariableValue ;
2) 具體作用
1.const 用于指針的兩種情況分析:
int const *A; //A可變,*A不可變
int *const A; //A不可變,*A可變
分析:const 是一個(gè)左結(jié)合的類型修飾符,它與其左側(cè)的類型修飾符和為一個(gè)
類型修飾符,所以,int const 限定 *A,不限定A。int *const 限定A,不限定*A。
2.const 限定函數(shù)的傳遞值參數(shù):
void Fun(const int Var);
分析:上述寫法限定參數(shù)在函數(shù)體中不可被改變。
3.const 限定函數(shù)的值型返回值:
const int Fun1();
const MyClass Fun2();
分析:上述寫法限定函數(shù)的返回值不可被更新,當(dāng)函數(shù)返回內(nèi)部的類型時(shí)(如Fun1),已經(jīng)是一個(gè)數(shù)值,
當(dāng)然不可被賦值更新,所以,此時(shí)const無意義,最好去掉,以免困惑。當(dāng)函數(shù)返回自定義的類型時(shí)(如Fun2)
,這個(gè)類型仍然包含可以被賦值的變量成員,所以,此時(shí)有意義。
4. 傳遞與返回地址: 此種情況最為常見,由地址變量的特點(diǎn)可知,適當(dāng)使用const,意義昭然。
5. const 限定類的成員函數(shù):
class ClassName {
public:
int Fun() const;
.....
}
注意:采用此種const 后置的形式是一種規(guī)定,亦為了不引起混淆。在此函數(shù)的聲明中和定義中均要使用
const,因?yàn)閏onst已經(jīng)成為類型信息的一部分。
獲得能力:可以操作常量對(duì)象。
失去能力:不能修改類的數(shù)據(jù)成員,不能在函數(shù)中調(diào)用其他不是const的函數(shù)。
三 inline 產(chǎn)生背景
inline這個(gè)關(guān)鍵字的引入原因和const十分相似,inline 關(guān)鍵字用來定義一個(gè)類的內(nèi)聯(lián)函數(shù),引入它的主要原
因是用它替代C中
表達(dá)式形式的宏定義。
表達(dá)式形式的宏定義一例:
#define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2)
這種表達(dá)式形式宏形式與作用跟函數(shù)類似,但它使用預(yù)編譯器,沒有堆棧,使用上比函數(shù)高效。但它只
是預(yù)編譯器上符號(hào)表的簡(jiǎn)單替換,不能進(jìn)行參數(shù)有效性檢測(cè)及使用C++類的成員訪問控制。
inline 推出的目的,也正是為了取代這種表達(dá)式形式的宏定義,它消除了它的缺點(diǎn),同時(shí)又很好地繼承了它的
優(yōu)點(diǎn)。inline代碼放入預(yù)編譯器符號(hào)表中,高效;它是個(gè)真正的函數(shù),調(diào)用時(shí)有嚴(yán)格的參數(shù)檢測(cè);它也可作為
類的成員函數(shù)。
2) 具體作用
直接在class類定義中定義各函數(shù)成員,系統(tǒng)將他們作為內(nèi)聯(lián)函數(shù)處理; 成員函數(shù)是內(nèi)聯(lián)函數(shù),意味著:每個(gè)
對(duì)象都有該函數(shù)一份獨(dú)立的拷貝。
在類外,如果使用關(guān)鍵字inline定義函數(shù)成員,則系統(tǒng)也會(huì)作為內(nèi)聯(lián)函數(shù)處理;
C關(guān)鍵字
#define 宏名
要替換的代碼
宏定義,保存在預(yù)編譯器的符號(hào)表中,執(zhí)行高效;作為一種簡(jiǎn)單的符號(hào)替換,不進(jìn)行其中參數(shù)有效性的檢測(cè)
typedef
已有類型
新類型
別名,
常用于創(chuàng)建平臺(tái)無關(guān)類型, typedef 在編譯時(shí)被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換。