前言
在《const關(guān)鍵字到底該怎么用》一文中介紹了C語言中的const關(guān)鍵字,本文說說C++中的const關(guān)鍵字,它的大部分特點(diǎn)和C語言中的類似,所以本文主要針對不同之處。
修飾普通變量--只讀
在C語言,雖然表面是不允許被修改,但是看下面的代碼:
#include intmain(void) { constinta=10; int*p=&a; *p=11; printf("a=%d\n",a); return0; } 它的輸出結(jié)果是a=11 所以C語言里,表面上它是只讀的,然而你違規(guī)操作仍然能改變。但是,千萬不要寫這樣的代碼!??! 與C語言中const關(guān)鍵字不同的是,C++中使用const關(guān)鍵字定義的b變量的值在被改變時會被檢測。 看一個例子就明白了:#include intmain() { constinta=10; int*p=&a; *p=11; return0; } 編譯報(bào)錯如下:main.cpp:Infunction‘intmain()’: main.cpp:5:14:error:invalidconversionfrom‘constint*’to‘int*’[-fpermissive] int*p=&a; 再次強(qiáng)調(diào):在實(shí)際中千萬不要寫這樣的代碼,這里只是為了說明問題。另外它們的作用也是一樣的,聲明一個只讀變量,不希望被修改,一旦被修改,編譯器將會報(bào)錯。 但是你運(yùn)行下面的代碼,又會有驚喜:#include voidtest(constchar*str) { char*p=(char*)str; p[0]='2'; } intmain(void) { chara[]="12345"; test(a); return0; }畢竟未定義行為常常有驚喜。 我們常??吹絺鬟fconst char*參數(shù),像這樣:voidtest(constchar*str); 卻似乎從來沒有見到過const int作為參數(shù)的函數(shù):voidtest(constintval); 為何?因?yàn)榍罢邆鬟f指針的副本,指針指向不會被改變,但可以改變指向的內(nèi)容;但是int類型參數(shù),它也是傳遞副本,但是永遠(yuǎn)不會被函數(shù)改變,自然也沒有必要加const關(guān)鍵字。更多解釋可以參考《傳值和傳指針》。 同樣的,修飾函數(shù)返回值時,修飾內(nèi)置類型與不加const修飾是一樣的,但對于自定義類型,不能對返回值進(jìn)行修改,即返回的是常量。
作用在成員函數(shù)-不改變成員變量
舉個例子:
#include classTest { private: inta; public: voidprintA()const { a=10; } }; intmain() { Testtest; test.printA(); return0; } 類test中有一個成員變量a,并且有一個成員函數(shù)printA,現(xiàn)在假設(shè)你的設(shè)計(jì)是printA函數(shù)不會改變?nèi)魏纬蓡T變量,那么你可以在printA函數(shù)后加上const關(guān)鍵字,這樣一旦函內(nèi)部嘗試修改成員變量,都會報(bào)錯:main.cpp:Inmemberfunction‘voidTest::printA()const’: main.cpp:9:13:error:assignmentofmember‘Test::a’inread-onlyobject a=10; 正因如此,const修飾成員函數(shù)不與static關(guān)鍵字同用,因?yàn)閟tatic修飾的靜態(tài)成員函數(shù)不能實(shí)例化,也就沒有實(shí)例的成員變量一說,自然不存在修改成員變量。 即下面的聲明是非法的:staticvoidprintA()const
修飾類成員變量--構(gòu)造函數(shù)中初始化
與修飾普通變量不同的是,修飾類成員變量還可以在構(gòu)造函數(shù)中初始化。如:
#include classTest { private: constinta; public: Test(intval):a(val){} }; intmain() { Testtest(1); return0; }
修飾引用
例如,有一個常量
constinta=10; 你不能再這樣定義它的引用:int&ref=a; 而需要定義對常量的引用,即:constint&ref=a; 為什么呢?因?yàn)椴荒苤苯訛閍賦值,也不能間接賦值,所以自然不能定義普通引用去間接改變它。
總結(jié)
關(guān)于const關(guān)鍵字在C和C++中的區(qū)別,想必到這里你已經(jīng)清楚了。const關(guān)鍵字通常能借助編譯器幫助我們提前發(fā)現(xiàn)一些不易察覺的問題。 如果你對下面的問題還不清楚,建議閱讀《const關(guān)鍵字到底該怎么用》 你能分清下面的聲明區(qū)別嗎?
constint*p; int*constp; intconst*constp;
-
關(guān)鍵詞
+關(guān)注
關(guān)注
0文章
16瀏覽量
9825 -
C語音
+關(guān)注
關(guān)注
0文章
12瀏覽量
12646 -
CONST
+關(guān)注
關(guān)注
0文章
44瀏覽量
8173
發(fā)布評論請先 登錄
相關(guān)推薦
評論