0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++與C的const關(guān)鍵字有何差別?

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-03 14:51 ? 次閱讀

前言

在《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;

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 關(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
收藏 人收藏

    評論

    相關(guān)推薦

    C語言關(guān)鍵字分別發(fā)生在哪個階段

    在編譯的第一個階段:預(yù)處理,對一些宏定義做替換。 第二個,const。 C語言中的 const 用于修飾只讀變量,表示變量本身不能修改。 這個關(guān)鍵字會在編譯的第二步起作用,也就是編譯。
    的頭像 發(fā)表于 11-24 10:31 ?190次閱讀

    C++新手容易犯的十個編程錯誤

    簡單的總結(jié)一下?C++ 新手容易犯的一些編程錯誤,給新人們提供一個參考。 1 有些關(guān)鍵字在 cpp 文件中多寫了 對于 C++ 類,一些關(guān)鍵字只要寫在 .h 中就好,cpp 中就不用再
    的頭像 發(fā)表于 11-15 12:42 ?390次閱讀

    C語言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?245次閱讀

    C7000優(yōu)化C/C++編譯器

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費(fèi)下載
    發(fā)表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C語言關(guān)鍵字--typedef

    C語言關(guān)鍵字使用方法學(xué)習(xí)指南!
    的頭像 發(fā)表于 10-07 12:44 ?270次閱讀

    使用邊緣AI和Sitara處理器進(jìn)行關(guān)鍵字檢測

    電子發(fā)燒友網(wǎng)站提供《使用邊緣AI和Sitara處理器進(jìn)行關(guān)鍵字檢測.pdf》資料免費(fèi)下載
    發(fā)表于 09-02 11:30 ?0次下載
    使用邊緣AI和Sitara處理器進(jìn)行<b class='flag-5'>關(guān)鍵字</b>檢測

    C++中實(shí)現(xiàn)類似instanceof的方法

    C++多態(tài)與繼承,但是很多人開始學(xué)習(xí)C++,有時候會面臨一個常見問題,就是如何向下轉(zhuǎn)型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有insta
    的頭像 發(fā)表于 07-18 10:16 ?603次閱讀
    <b class='flag-5'>C++</b>中實(shí)現(xiàn)類似instanceof的方法

    快速掌握C語言關(guān)鍵字

    C語言中的32個關(guān)鍵字你知道多少個呢?根據(jù)關(guān)鍵字的作用分為四類:數(shù)據(jù)類型關(guān)鍵字、控制語句關(guān)鍵字、存儲類型
    的頭像 發(fā)表于 07-06 08:04 ?357次閱讀
    快速掌握<b class='flag-5'>C</b>語言<b class='flag-5'>關(guān)鍵字</b>

    嵌入式C語言面試大挑戰(zhàn)

    C++中static關(guān)鍵字除了具有C中的作用還有在類中的使用在類中,static可以用來修飾靜態(tài)數(shù)據(jù)成員和靜態(tài)成員方法靜態(tài)數(shù)據(jù)成員
    發(fā)表于 03-05 14:18 ?356次閱讀
    嵌入式<b class='flag-5'>C</b>語言面試大挑戰(zhàn)

    簡單總結(jié)一下嵌入式C++中常見的錯誤形式

    對于 C++ 類,一些關(guān)鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等關(guān)鍵字,如果在 cpp 中多寫,編譯器會報(bào)錯。
    的頭像 發(fā)表于 02-23 09:40 ?515次閱讀

    關(guān)鍵字搜索文件夾中某個TXT文件

    文件夾中隨時創(chuàng)造TXT文件,如何及時選出剛創(chuàng)造的文件?或關(guān)鍵字搜索出需要的TXT文件?
    發(fā)表于 02-06 15:22

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠?qū)τ?jì)算機(jī)硬件進(jìn)行直接操作。
    的頭像 發(fā)表于 02-05 14:11 ?2421次閱讀

    vb語言和c++語言的區(qū)別

    Microsoft開發(fā)的一種面向?qū)ο蟮氖录?qū)動編程語言。它的設(shè)計(jì)目標(biāo)是簡化編程過程,讓初學(xué)者也能快速上手。與之相比,C++語言是一種通用的、面向?qū)ο蟮木幊陶Z言,其設(shè)計(jì)目標(biāo)是提供高性能的系統(tǒng)級編程。 語法: VB語言的語法較為簡單,使用了很多可讀性強(qiáng)的關(guān)鍵詞,如“
    的頭像 發(fā)表于 02-01 10:20 ?2355次閱讀

    在NVM和本地\"內(nèi)存中定義數(shù)組(靜態(tài) /global /local)的\"關(guān)鍵字是什么?

    在 NVM 和本地\"內(nèi)存中定義數(shù)組(靜態(tài) /global /local)的\"關(guān)鍵字是什么? 還有與 32 位對齊的關(guān)鍵字怎么樣。
    發(fā)表于 01-25 07:52

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個版本,來了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?609次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的