久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    C++中const用法淺析 - 中華考試網(Examw.Com)

     一葉之楓 2010-07-19

    C++中const用法淺析

    中華IT學院 加入收藏  【 】  [ 2010-3-23 ]
     
     
     
     
    看到const 關鍵字,很多程序員想到的可能是const 常量,這可有點象踩到陷井上還不知道自己危險了。讀讀以下文字會使你對c++中的const有一個全面的認識。

      const 是C++中常用的類型修飾符,有某些微妙的應用場合,如果沒有搞清本源,則錯誤在所難免。本篇中將對const進行辨析。溯其本源,究其實質,希望能對大家理解const有所幫助,根據思維的承接關系,分為如下幾個部分進行闡述。

      C++中為什么會引入const

      C++的提出者當初是基于什么樣的目的引入(或者說保留)const關鍵字呢?,這是一個有趣又有益的話題,對理解const很有幫助。

      1. 大家知道,C++有一個類型嚴格的編譯系統,這使得C++程序的錯誤在編譯階段即可發現許多,從而使得出錯率大為減少,因此,也成為了C++與C相比,有著突出優點的一個方面。

      2. C中很常見的預處理指令 #define VariableName VariableValue 可以很方便地進行值替代,這種值替代至少在三個方面優點突出:

      一是避免了意義模糊的數字出現,使得程序語義流暢清晰,如下例:

      #define USER_NUM_MAX 107 這樣就避免了直接使用107帶來的困惑。

      二是可以很方便地進行參數的調整與修改,如上例,當人數由107變為201時,進改動此處即可,

      三是提高了程序的執行效率,由于使用了預編譯器進行值替代,并不需要為這些常量分配存儲空間,所以執行的效率較高。

      鑒于以上的優點,這種預定義指令的使用在程序中隨處可見。

      3. 說到這里,大家可能會迷惑上述的1點、2點與const有什么關系呢?,好,請接著向下看來:

      預處理語句雖然有以上的許多優點,但它有個比較致命的缺點,即,預處理語句僅僅只是簡單值替代,缺乏類型的檢測機制。這樣預處理語句就不能享受C++嚴格類型檢查的好處,從而可能成為引發一系列錯誤的隱患。

      4.好了,第一階段結論出來了:

      結論: Const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。

      現在它的形式變成了:

      Const DataType VariableName = VariableValue ;

      為什么const能很好地取代預定義語句?

      const 到底有什么大神通,使它可以振臂一揮取代預定義語句呢?

      1. 首先,以const 修飾的常量值,具有不可變性,這是它能取代預定義語句的基礎。

      2. 第二,很明顯,它也同樣可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。

      3. 第三,C++的編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高,同時,這也是它取代預定義語句的重要基礎。

      這里,我要提一下,為什么說這一點是也是它能取代預定義語句的基礎,這是因為,編譯器不會去讀存儲的內容,如果編譯器為const分配了存儲空間,它就不能夠成為一個編譯期間的常量了。

     4. 最后,const定義也像一個普通的變量定義一樣,它會由編譯器對它進行類型的檢測,消除了預定義語句的隱患。

      const 使用情況分類詳析

      1.const 用于指針的兩種情況分析:

      int const *a; //a/可變,*a不可變

      int *const a; //a不可變,*a可變

      分析:const 是一個左結合的類型修飾符,它與其左側的類型修飾符合為一個類型

      修飾符,所以,int const 限定 *a,不限定a。int *const 限定a,不限定*a。

      2.const 限定函數的傳遞值參數:

      void fun(const int var);

      分析:上述寫法限定參數在函數體中不可被改變。由值傳遞的特點可知,var在函數體中的改變不會影響到函數外部。所以,此限定與函數的使用者無關,僅與函數的編寫者有關。

      結論:最好在函數的內部進行限定,對外部調用者屏蔽,以免引起困惑。如可改寫如下:

      void fun(int var){

      const int & varalias = var;

      varalias .........

      }

      3.const 限定函數的值型返回值:

      const int fun1();

      const myclass fun2();

      分析:上述寫法限定函數的返回值不可被更新,當函數返回內部的類型時(如fun1),已經是一個數值,當然不可被賦值更新,所以,此時 const無意義,最好去掉,以免困惑。當函數返回自定義的類型時(如fun2),這個類型仍然包含可以被賦值的變量成員,所以,此時有意義。

      4. 傳遞與返回地址: 此種情況最為常見,由地址變量的特點可知,適當使用const,意義昭然。

      5. const 限定類的成員函數:

      class classname {

      public:

      int fun() const;

      .....

      }

      注意:采用此種const 后置的形式是一種規定,亦為了不引起混淆。在此函數的聲明中和定義中均要使用const,因為const已經成為類型信息的一部分。

      獲得能力:可以操作常量對象。

      失去能力:不能修改類的數據成員,不能在函數中調用其他不是const的函數。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 国99久9在线 | 免费| 中文字幕国产原创国产| 国产精品自在线拍国产手机版| 精品一卡2卡三卡4卡乱码精品视频| 日本成熟少妇激情视频免费看| 国产丝袜视频一区二区三区| 在线免费成人亚洲av| 久久99精品久久久久久齐齐| 日韩国产成人精品视频| 亚洲高清最新AV网站| 国产av无码专区亚洲av软件| 西西大胆午夜人体视频| 虎白女粉嫩尤物福利视频| 亚洲人成中文字幕在线观看| 亚洲第一极品精品无码久久| 99RE6在线视频精品免费下载| 人妻少妇无码精品专区| 欧美成 人影片 免费观看| 男女扒开双腿猛进入爽爽免费看| 精精国产XXX在线观看| 国产一区二区三区在线观看免费| 国产欧美VA天堂在线观看视频| 四虎成人在线观看免费| 无码国产精品一区二区免费式影视 | 国产成人AV三级在线观看| 亚洲情A成黄在线观看动漫尤物| 久久久久无码国产精品不卡 | 亚洲成在人线AV品善网好看| 欧美黑人又大又粗XXXXX| 久久香蕉国产线看观看怡红院妓院| 午夜无码电影888不卡| 成 人色 网 站 欧美大片| 国产精品普通话国语对白露脸| 国产乱子伦一区二区三区| 男女18禁啪啪无遮挡激烈| 双乳奶水饱满少妇呻吟免费看| 饥渴的少妇2中文字幕| 精品 日韩 国产 欧美 视频| 少妇办公室好紧好爽再浪一点| 成人网站WWW污污污网站| 国产成人精品无码免费看|