github:
首先說明一下
const在c
和c++
中的主要用法,被
const
修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。它可以修飾變數、函式的引數、返回值,甚至函式的定義體。
const
修飾變數通常用於定義符號常量。我們過去一般使用巨集定義的方式定義符號常量,比如:
#define pi3.1415926
其實我們也可以使用
const
方式定義符號常量,下面的語句與上面巨集定義的方式達到的效果相似。
const double pi3.1415926
那兩者有什麼區別呢?在使用巨集定義的方式時,首先在預處理過程中將源程式中的常量名全部替換成對應的字面常量,然後對替換過的源程式進行編譯。相比較之下
const
方式不涉及預處理過程,它只在編譯工程中起作用。因為巨集定義方式定義的符號常量沒有型別,所以不能進行嚴格的型別檢查,而
const
則可以,並且有些除錯工具可以對
const
常量進行除錯,而不能對巨集常量進行除錯。但這也不是說巨集常量就比
const
常量差,比如你能夠利用
const
常量實現下面的巨集定義功能麼?
#ifndefjiangxin_h
#definejiangxin_h
#endef
而且由於歷史原因,實際上使用巨集常量的情況遠遠大於
const
常量,特別是在純
c程式設計環境中。不過在
c++程式設計環境中,我還是推薦你使用
const
,因為這更加安全。同時時刻記住一句話,const
常量作用與編譯期,巨集常量作用於預編譯期,當你遇到一些令人迷惑的問題時想想這句話,或許能夠有所收穫。
現在舉幾個例子:
const int m = 0; //
其實我們通常把
const
符號常量叫做
const
常量,以便和巨集常量區分
typedef char * pstr; //
新的型別
pstr
,代表乙個指向
char
的指標型別。
char string[4] = "abc";
const char *p1 = string
;//p1
是乙個指標,指向乙個
const char
型別p1++; //
正確,p1
本身不是常量,它指向乙個常量
const pstr p2 = string; //p2
是乙個常量指標,這個指標指向乙個
char
型別變數
p2++; //
錯誤,p2
是乙個常量指標
char *const p3 = string; //p3同p2
相同,是乙個常量指標
char const* p4 = string; //p4同p1
相同,是乙個指向
const char
的指標,只能用於
c中,在
c++中只能使用
const char *p4 = string;
函式形參主要包括傳值型引數,傳指標型引數,傳引用型引數。
對於傳指標和傳引用型引數,如果我們怕在該函式中錯誤的改變實參的值,一般都會加上
const
來修飾形參。
對於傳值型引數,我們一般不會使用
const
修飾,因為完全沒有必要,你是不是用
const
,都不能改變實參的值,因為傳值型形參是在棧中分配的,函式呼叫之後一定會銷毀。例如:
void fun(int n)
和void fun(const int n)
沒有任何區別,而且還是**更加晦澀,所以不推薦。但是有一種情況需要考慮,如果你需要傳遞乙個比較複雜的類型別,但是你又不需要改變該類的物件,這時你可以將傳值改為傳指標或者引用,同時用
const
修飾。這樣的話就避免了構造臨時物件的開銷。比如加入
a是乙個很複雜的類型別,這是使用
void fun(const a &a)
要比void fun(a a)
效率更高。
函式的返回值與形參類似,也包括返回值型別,返回指標型別,返回引用型別。
對於返回值型別為指標或者引用的情況,如果我們不希望其被修改,可以使用
const
對返回值進行限定。此時該返回值
const
修飾的同型別
const
指標(返回值為指標)或者同型別的
const
變數(返回值為引用,且該值為基本型別或者定義了拷貝建構函式、拷貝賦值運算子的型別)。如對於:
const char * fun(void);
如下語句將出現編譯錯誤:
char *str = fun();//cannotconvert from 'const char *' to 'char *'
;正確的用法是:
const char *str= fun();
如果返回值型別為值型別,由於函式會把返回值複製到外部函式的儲存單元中,加
const
修飾沒有任何價值,所以
不要把函式
int fun(void)
寫成const int fun(void)
。但是在某些情況下將值型別改為引用型別或者指標型別可以提高效率,可用不用
const
就看你要不要改變它們了。
const
關鍵字可以放在函式宣告的尾部
,表示該類成員不修改物件。注意
const
只能修飾類的成員函式,不能修飾普通函式,無論是c還是
c++。
2016,不再迷茫
考慮了很久,終於決定起筆寫部落格了,不是因為沒有勇氣,是因為我不想再嘗試半途而廢的滋味了。在此之前,我經常心血來潮就開始做事,其間也付出不少努力,但是結果都不甚滿意,不是覺得不適合自己,就是覺得現在的環境不好,原因種種,但是我真的好想認認真真的完整的做一件事,並把它做好!於是我開始了我的第一篇部落格...
願你不再迷茫
如果歲月是一路漫長的旅途,人生則是其中的一道道深淺不一的腳印,且借西風遠望,視線中那一排排印痕,有的已被朔風磨去了稜角,被時光的陰翳悄然遮蔽,有的卻依然清晰,像被鐫刻在了翡翠青石之中,在時空的逆流中熠熠生輝 古人云 天行健,君子以自強不息。人生短暫,光陰無情,時光如流水般匆匆而過,來不及享受便已化作...
選IT不再讓我迷茫
高中畢業是乙個人人生分割點,高中畢業後,沒考好的同學面臨著各種迷茫,懷疑自己,到底自己還有什麼價值。需要面臨各種各樣的問題。北大青鳥豐台校區針對不同的學生,給出不同的報考意見,讓高考失利的學生對未來充滿信心,希望也可以培養學生的興趣,開闊眼界。剛畢業的吳勇說 在北大青鳥豐台校區之前,我剛高中畢業,那...