女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++與C的const關鍵字有何差別?

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-02-03 14:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

在《const關鍵字到底該怎么用》一文中介紹了C語言中的const關鍵字,本文說說C++中的const關鍵字,它的大部分特點和C語言中的類似,所以本文主要針對不同之處。

修飾普通變量--只讀

在C語言,雖然表面是不允許被修改,但是看下面的代碼:

#include intmain(void) { constinta=10; int*p=&a; *p=11; printf("a=%d\n",a); return0; } 它的輸出結果是a=11 所以C語言里,表面上它是只讀的,然而你違規操作仍然能改變。但是,千萬不要寫這樣的代碼!!! 與C語言中const關鍵字不同的是,C++中使用const關鍵字定義的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; 再次強調:在實際中千萬不要寫這樣的代碼,這里只是為了說明問題。另外它們的作用也是一樣的,聲明一個只讀變量,不希望被修改,一旦被修改,編譯器將會報錯。 但是你運行下面的代碼,又會有驚喜:#include voidtest(constchar*str) { char*p=(char*)str; p[0]='2'; } intmain(void) { chara[]="12345"; test(a); return0; }畢竟未定義行為常常有驚喜。 我們常常看到傳遞const char*參數,像這樣:voidtest(constchar*str); 卻似乎從來沒有見到過const int作為參數的函數:voidtest(constintval); 為何?因為前者傳遞指針的副本,指針指向不會被改變,但可以改變指向的內容;但是int類型參數,它也是傳遞副本,但是永遠不會被函數改變,自然也沒有必要加const關鍵字。更多解釋可以參考《傳值和傳指針》。 同樣的,修飾函數返回值時,修飾內置類型與不加const修飾是一樣的,但對于自定義類型,不能對返回值進行修改,即返回的是常量。

作用在成員函數-不改變成員變量

舉個例子:

#include classTest { private: inta; public: voidprintA()const { a=10; } }; intmain() { Testtest; test.printA(); return0; } 類test中有一個成員變量a,并且有一個成員函數printA,現在假設你的設計是printA函數不會改變任何成員變量,那么你可以在printA函數后加上const關鍵字,這樣一旦函內部嘗試修改成員變量,都會報錯:main.cpp:Inmemberfunction‘voidTest::printA()const’: main.cpp:9:13:error:assignmentofmember‘Test::a’inread-onlyobject a=10; 正因如此,const修飾成員函數不與static關鍵字同用,因為static修飾的靜態成員函數不能實例化,也就沒有實例的成員變量一說,自然不存在修改成員變量。 即下面的聲明是非法的:staticvoidprintA()const

修飾類成員變量--構造函數中初始化

與修飾普通變量不同的是,修飾類成員變量還可以在構造函數中初始化。如:

#include classTest { private: constinta; public: Test(intval):a(val){} }; intmain() { Testtest(1); return0; }

修飾引用

例如,有一個常量

constinta=10; 你不能再這樣定義它的引用:int&ref=a; 而需要定義對常量的引用,即:constint&ref=a; 為什么呢?因為不能直接為a賦值,也不能間接賦值,所以自然不能定義普通引用去間接改變它。

總結

關于const關鍵字在C和C++中的區別,想必到這里你已經清楚了。const關鍵字通常能借助編譯器幫助我們提前發現一些不易察覺的問題。 如果你對下面的問題還不清楚,建議閱讀《const關鍵字到底該怎么用》 你能分清下面的聲明區別嗎?

constint*p; int*constp; intconst*constp;

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 關鍵詞
    +關注

    關注

    0

    文章

    16

    瀏覽量

    10293
  • C語音
    +關注

    關注

    0

    文章

    12

    瀏覽量

    12801
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8463
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    micro 關鍵字搜索全覆蓋商品,并通過 API 接口提供實時數據

    micro 關鍵字搜索全覆蓋商品”并通過 API 接口提供實時數據
    的頭像 發表于 07-13 10:13 ?209次閱讀

    單片機編程關鍵字之volatile

    volatile 修飾的變量是說這變量可能會被意想不到地改變。通常對于程序員而言,單片機 中用的就算常見了volatile 是易變的,不穩定的意思。其實對于很多人來說,根本沒見過這個關鍵字,不 知道
    發表于 04-02 13:47 ?2次下載

    帶你在單片機編程中熟練使用const(可下載)

    C 語言關鍵字const 舉足輕重,我們今天就深度聊一聊 const 的定義和實際應用,讓它 不再是迷C 語言中
    發表于 04-01 14:18 ?2次下載

    const定義的是不是常量

    變成數字 5。 第二種跟宏定義類似,常量也可以在編譯的時候通過編譯器傳入。 以 gcc 為例,編譯的時候提供 -D 選項,同樣會在預處理的時候替換成相應的數字。 第三種枚舉,使用 enum 關鍵字。 枚舉的特點是默認從 0 開始,逐漸遞增。如果需要大量含義相同的常量
    的頭像 發表于 01-14 11:35 ?433次閱讀

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發表于 01-14 09:40 ?619次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    同樣是函數,在CC++中有什么區別

    ,即使沒有數據返回,也得寫 void。 第二個函數名。 C語言的函數名絕對不能重名,除了用上 weak 這樣的黑科技。同一個項目中,函數重名就會提示重復定義。 C++因為函數重載的存在,函數名可以相同,只要參數區別就行。這兩個
    的頭像 發表于 11-29 10:25 ?909次閱讀

    C語言關鍵字分別發生在哪個階段

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

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

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

    C7000 C/C++優化指南用戶手冊

    電子發燒友網站提供《C7000 C/C++優化指南用戶手冊.pdf》資料免費下載
    發表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優化指南用戶手冊

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?767次閱讀

    C7000優化C/C++編譯器

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

    C語言關鍵字--typedef

    C語言關鍵字使用方法學習指南!
    的頭像 發表于 10-07 12:44 ?614次閱讀

    使用邊緣AI和Sitara處理器進行關鍵字檢測

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

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?10次下載

    C++中實現類似instanceof的方法

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