前言
在《const關(guān)鍵字到底該怎么用》一文中介紹了C語言中的const關(guān)鍵字,本文說說C++中的const關(guā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; } 編譯報錯如下:main.cpp:Infunction‘intmain()’: main.cpp:5:14:error:invalidconversionfrom‘constint*’to‘int*’[-fpermissive] int*p=&a; 再次強(qiáng)調(diào):在實際中千萬不要寫這樣的代碼,這里只是為了說明問題。另外它們的作用也是一樣的,聲明一個只讀變量,不希望被修改,一旦被修改,編譯器將會報錯。 但是你運行下面的代碼,又會有驚喜:#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); 為何?因為前者傳遞指針的副本,指針指向不會被改變,但可以改變指向的內(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è)計是printA函數(shù)不會改變?nèi)魏纬蓡T變量,那么你可以在printA函數(shù)后加上const關(guān)鍵字,這樣一旦函內(nèi)部嘗試修改成員變量,都會報錯:main.cpp:Inmemberfunction‘voidTest::printA()const’: main.cpp:9:13:error:assignmentofmember‘Test::a’inread-onlyobject a=10; 正因如此,const修飾成員函數(shù)不與static關(guān)鍵字同用,因為static修飾的靜態(tài)成員函數(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; 為什么呢?因為不能直接為a賦值,也不能間接賦值,所以自然不能定義普通引用去間接改變它。
總結(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瀏覽量
9842 -
C語音
+關(guān)注
關(guān)注
0文章
12瀏覽量
12685 -
CONST
+關(guān)注
關(guān)注
0文章
45瀏覽量
8193
發(fā)布評論請先 登錄
相關(guān)推薦
const定義的是不是常量
Spire.XLS for C++組件說明
![Spire.XLS for <b class='flag-5'>C++</b>組件說明](https://file1.elecfans.com/web3/M00/05/E7/wKgZO2eFwUuAbuoQAAAbn_khf8A091.png)
同樣是函數(shù),在C和C++中有什么區(qū)別
C語言關(guān)鍵字分別發(fā)生在哪個階段
C++新手容易犯的十個編程錯誤
使用邊緣AI和Sitara處理器進(jìn)行關(guān)鍵字檢測
![使用邊緣AI和Sitara處理器進(jìn)行<b class='flag-5'>關(guān)鍵字</b>檢測](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
C++中實現(xiàn)類似instanceof的方法
![<b class='flag-5'>C++</b>中實現(xiàn)類似instanceof的方法](https://file1.elecfans.com/web2/M00/FE/0C/wKgaomaYe1CAQ31QAAAnf0IkoSU605.png)
快速掌握C語言關(guān)鍵字
![快速掌握<b class='flag-5'>C</b>語言<b class='flag-5'>關(guān)鍵字</b>](https://file.elecfans.com/web2/M00/9B/3D/poYBAGQjnauAVXOgAABFcEbXdEE684.png)
鴻蒙OS開發(fā)實例:【Native C++】
![鴻蒙OS開發(fā)實例:【Native <b class='flag-5'>C++</b>】](https://file1.elecfans.com/web2/M00/C8/31/wKgZomYZMTCAaDv3AAY5x13C324319.jpg)
使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯誤
![使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環(huán)中的錯誤](https://file1.elecfans.com/web2/M00/A9/66/wKgZomUl7m-AHJX6AABuJjgxs14678.png)
嵌入式C語言面試大挑戰(zhàn)
![嵌入式<b class='flag-5'>C</b>語言面試大挑戰(zhàn)](https://file1.elecfans.com/web2/M00/C3/99/wKgaomXmudSAfByVAAAaS7J-56c861.png)
評論