最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中多才多藝的 const

 更新時間:2021年09月26日 11:00:01   作者:干燥劑  
在C++中,關(guān)鍵字const可以用來修飾任何作用域內(nèi)的變量、函數(shù)參數(shù)、函數(shù)本體、函數(shù)返回值、成員函數(shù)、迭代器,也可以用來修飾指針本身和指針目標(biāo),可謂多才多藝,我們要詳細(xì)了解其內(nèi)部細(xì)節(jié),以及邏輯奧秘,讓這把多功能瑞士軍刀盡情發(fā)揮其作用,需要的朋友可以參考一下

1. 定義一個常全局變量

const int global = 100; // 初始化之后不可再賦值

這樣的global實際上是一個常量,這是C++用來取代宏定義的其中一種措施,const常量有類型檢測,提高編譯器的效率。

2. 定義常指針

這有兩個版本,分別是:

const int *p1 = &a; // p1不能修改它所指向的目標(biāo)
int const *p1 = &a; // p1的另一種等價形式
int *const p2 = &a; // p2本身不可修改

上述代碼中的p1經(jīng)常被用作函數(shù)參數(shù),用以限制指針的權(quán)限,在安全性方面功不可沒。p2用的很少,我們很少需要一個本身指向不可變的指針

3. 定義一個STL的常迭代器

這也有類似的兩個版本:

vector::const_iterator it1; // it1不能修改它所指代的目標(biāo)對象

const vector::iterator it2; // it2本身不可修改

由于迭代器實際上就是廣義指針,因此it1實際上相當(dāng)于上述代碼的p1,it2相當(dāng)于上述代碼的p2,同理it1用的較多,用來限制迭代器的權(quán)限。

4. 定義一個類的內(nèi)部常成員

包括常成員數(shù)據(jù)和常成員方法:

class text

{

     const int aconst = 100; // 常成員數(shù)據(jù),必須初始化

     void func(void) const; // 常成員方法,只能由常對象調(diào)用

     static int astatic;

};

類的常成員數(shù)據(jù)aconst,意味著類對象無法對其修改,這個很容易理解。至于類的常成員方法func就破費腦力了,語法上的理解是,func不能修改任何一個類對象的bit,這是顯而易見的,這也正是C++標(biāo)準(zhǔn)對const成員方法的定義。\

來近距離看看func方法的使用:

int text::astatic = 100; // 類外初始化靜態(tài)數(shù)據(jù)

void text::func(void) const // 類外定義const成員方法

{

astatic = 200; // 沒毛病,astatic不是對象數(shù)據(jù),此處可以被修改

aconst = 200; // 錯誤!const型函數(shù)不可修改類對象數(shù)據(jù)

}

定義如上的成員方法很重要,因為它明確地告訴了類的使用者,哪些函數(shù)可以修改類對象信息,哪些不會修改類對象信息。

func() 這樣的函數(shù)const成員方法,只能被常對象調(diào)用,以確保不違反權(quán)限緊縮原則,比如:

text t1; // 普通對象t1
const text t2; // const型對象t2
t1.func(); // 錯誤!普通對象不可調(diào)用常成員方法
t2.func(); 

注意:函數(shù)本體的const屬性是可以被視為重載的依據(jù)的,換句話說如果以上類text提供了non-const版本的func函數(shù),那么t1將會自動調(diào)用non-const那個版本。

以上陳述似乎平淡乏味,但考慮C++語法規(guī)定的這種bit-wise特性的常成員在處理類成員指針,并且指針指向類外部內(nèi)存時,情況也許會變得有趣。

5. bit-wise和logical-wise常特性

所謂bit-wise constness指的是類對象的內(nèi)部內(nèi)存意義上只讀約束,而loigcal-wise指的是邏輯意義上的只讀約束。編譯器沒有智能,它只能實現(xiàn)bit-wise意義上的約束,下面的例子討論const成員 operator[ ] 的表現(xiàn)可以幫助理解:

class text
{
     ... ...
     char &operator[ ](int pos) const;
private:
     char *p;
};

// const關(guān)鍵字保證了該成員方法只能被 const 對象調(diào)用
char &text::operator[ ](int pos) const
{
      return p[pos];
}

上述代碼中,類text存儲真正字符串的地方是指針 p 指向的內(nèi)存區(qū)域,假設(shè)此時定義一個 const 型的常對象,那么它只能保證類內(nèi)部信息(也就是p本身)不被修改,卻無法保證其所指向的內(nèi)存區(qū)域的安全性。來看下面的代碼:

const text ct("abcd");

ct[0] = 'A'; // 一個被編譯器允許卻跟邏輯相悖的語句

此處ct是一個const型對象,從字面理解出發(fā),我們應(yīng)該認(rèn)為ct對象是一個常量,我們應(yīng)該無法通過任何方式修改其內(nèi)部信息,但可惜,ct里面的字符串信息實際上并不存在在類內(nèi)存區(qū)域中,于是就出現(xiàn)了可以對一個const型對象進(jìn)行賦值的有趣現(xiàn)象。

解決以上問題也不難,可以改寫 operator[ ] 成員方法的返回值類型:

const char &operator[ ](int pos) const;

此時就再也不能對 ct[0] 賦值了,但這只是個個例,關(guān)鍵我們要掌握的內(nèi)容是:如果我們的類對象擁有成員指針,那么一般意義上的const成員方法只能保證bits-wise的常量性(即保證類對象內(nèi)部的內(nèi)存信息不被修改),但無法保證所謂的 logical-wise的常量性(即保證邏輯上哪些信息不被修改)。

到此這篇關(guān)于C++中的 const的文章就介紹到這了,更多相關(guān)C++中的const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)斗地主的核心算法

    C語言實現(xiàn)斗地主的核心算法

    本文給大家分享的是使用C語言實現(xiàn)的斗地主游戲的核心算法,主要實現(xiàn)了面向?qū)ο笤O(shè)計,洗牌、發(fā)牌、判斷牌型、比較牌的大小、游戲規(guī)則等算法。通過這個斗地主小項目的練習(xí),提高了我的面向?qū)ο笤O(shè)計能力,加深了對算法的理解。最近把這些設(shè)計和算法分享給大家。
    2015-03-03
  • C++實現(xiàn)控制臺隨機迷宮的示例代碼

    C++實現(xiàn)控制臺隨機迷宮的示例代碼

    本文主要介紹了C++實現(xiàn)控制臺隨機迷宮的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)

    教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)

    通過本文教大家如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-01-01
  • C++JSON庫CJsonObject詳解(輕量簡單好用)

    C++JSON庫CJsonObject詳解(輕量簡單好用)

    CJsonObject是基于cJSON全新開發(fā)一個C++版的JSON庫,CJsonObject的最大優(yōu)勢是輕量簡單好用,開發(fā)效率極高,對多層嵌套json的讀取和生成使用非常簡單,喜歡的朋友一起看看吧
    2021-04-04
  • C++實現(xiàn)連連看消除算法

    C++實現(xiàn)連連看消除算法

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)連連看消除算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++用函數(shù)對算法性能進(jìn)行測試

    C++用函數(shù)對算法性能進(jìn)行測試

    算法無處不在,算法是程序的靈魂,而數(shù)據(jù)結(jié)構(gòu)則是程序的骨架,二者共同構(gòu)成了程序,那么如何評估算法的性能呢?理論上可以通過計算時間復(fù)雜度的方法來評估,但這是理性的認(rèn)識,我們還有一種直觀的評估方法,那就是程序執(zhí)行的時間
    2022-08-08
  • C語言仿QQ聊天界面抖動功能

    C語言仿QQ聊天界面抖動功能

    這篇文章主要為大家詳細(xì)介紹了C語言仿QQ聊天界面抖動功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 海量數(shù)據(jù)處理系列之:用C++實現(xiàn)Bitmap算法

    海量數(shù)據(jù)處理系列之:用C++實現(xiàn)Bitmap算法

    本篇文章是對用C++實現(xiàn)Bitmap算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實現(xiàn)雙向鏈表

    C語言實現(xiàn)雙向鏈表

    本文給大家分享的是一段使用C語言實現(xiàn)雙向鏈表的代碼,完全是根據(jù)自己的理解和認(rèn)識來編寫的,希望大家能夠喜歡,文章的最后附上了一個網(wǎng)友寫的對于雙向鏈表刪除節(jié)點、插入節(jié)點、雙向輸出等操作的代碼,也非常不錯,推薦給大家
    2015-03-03
  • ???????C語言實現(xiàn)單鏈表基本操作方法

    ???????C語言實現(xiàn)單鏈表基本操作方法

    這篇文章主要介紹了???????C語言實現(xiàn)單鏈表基本操作方法,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05

最新評論

福泉市| 盘山县| 日土县| 兴仁县| 山西省| 沂源县| 治多县| 北川| 克拉玛依市| 襄垣县| 奈曼旗| 靖宇县| 三河市| 北宁市| 门头沟区| 北辰区| 阿克陶县| 平昌县| 九寨沟县| 太白县| 石景山区| 耒阳市| 额尔古纳市| 如东县| 老河口市| 呼伦贝尔市| 左权县| 吉木萨尔县| 两当县| 翁源县| 宁城县| 徐汇区| 登封市| 新乐市| 金平| 洞口县| 吴川市| 南雄市| 通海县| 巴彦淖尔市| 志丹县|