C++中的const辕棚、static和extern

1. const

  1. 常量變量
    const 類型說(shuō)明符 變量名
const int num = 1; // 在定義num后贪磺,不能對(duì)該變量進(jìn)行修改
  1. 常引用
    const 類型說(shuō)明符 &引用名
const int &num = a;
num = 1;   //錯(cuò)誤
a = 1; // 正確
/* 注意:
    在什么時(shí)候使用常引用:如果既要利用引用提高程序的效率坯苹,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在
    函數(shù)中被改變参咙,就應(yīng)使用常引用
*/
  1. 常對(duì)象
    類名 const 對(duì)象名 或者 const 類名 對(duì)象名
class A
{
    private:
      int a;
    public:
      A(int b){a = b;}
  };
A const A_num(5);
// const A A_num(5); 和上面的那個(gè)常對(duì)象是等價(jià)的
/*
    注意:
    1. 在定義常對(duì)象的時(shí)候,必須要有初值
    2. 如果定義常對(duì)象惰赋,則不能調(diào)用該對(duì)象中非const成員函數(shù)(系統(tǒng)隱式調(diào)用的構(gòu)造函數(shù)和
       析構(gòu)函數(shù))
    3. 增加數(shù)據(jù)的安全性宰掉,防止誤操作而改變相關(guān)數(shù)據(jù)
    4. 常對(duì)象的成員數(shù)據(jù)都是常成員數(shù)據(jù),因此常對(duì)象的構(gòu)造函數(shù)只能用參數(shù)初始化表對(duì)常數(shù)
       據(jù)成員進(jìn)行初始化赁濒。*/
  1. 常成員數(shù)據(jù)
    const 數(shù)據(jù)類型 常量名
class A
{
  private:
      const int num;
  // 常成員數(shù)據(jù)賦初值
  A(int num1){num = num1;} //錯(cuò)誤
  A(int num1):num(num1){}  //正確
  /*常成員數(shù)據(jù)的作用和用法與普通常量變量相似轨奄,用關(guān)鍵字const來(lái)聲明常數(shù)據(jù)成員。常數(shù)據(jù)
    成員的值是不能改變的拒炎。*/
}挪拟;
  1. 常成員函數(shù)
    類名::fun(形參) const
class A
{
  private:
      int num_a;
      int num_b;
      int sum;
  public:
      A(int a = 5, int b = 6){num_a = a; num_b = b;sum = 0;}
      void sum_num() const;
}
A::void sum_num() const
{
    sum = sum_a + sum_b;
}
/*注意:
       1. const是函數(shù)類型的一部分,在聲明函數(shù)和定義函數(shù)時(shí)都要有const關(guān)鍵字击你,
          在調(diào)用時(shí)不必加const玉组;
       2. 常成員函數(shù)可以引用const數(shù)據(jù)成員,也可以引用非const的數(shù)據(jù)成員丁侄。
          const數(shù)據(jù)成員可以被const成員函數(shù)引用惯雳,也可以被非const的成員函數(shù)引用。
  */
  1. 常數(shù)組
    類型說(shuō)明符 const 數(shù)組名[大小]
int const arr[10];
  1. 常指針
    const 類型說(shuō)明符 指針名* 或者 類型說(shuō)明符 const 指針名*
const int *p;
int const *p;
[ const使用場(chǎng)景 ]
  1. const修飾普通變量(例如:全局鸿摇、局部變量)石景;

  2. const修飾函數(shù)形參,一般和引用同時(shí)使用;

  3. const修飾函數(shù)返回值潮孽;

  4. const修飾類數(shù)據(jù)成員揪荣,必須在構(gòu)造函數(shù)的初始化列表中初始化;

  5. const修飾類成員函數(shù)往史,實(shí)際修飾隱含的this变逃,表示在類中不可以對(duì)類的任何成員進(jìn)行修改;

  6. 在const修飾的成員函數(shù)中要對(duì)類的某個(gè)數(shù)據(jù)成員進(jìn)行修改怠堪,該數(shù)據(jù)成員定義聲明是必須加mutable關(guān)鍵字。

  7. const修飾this指針不能改變
    const對(duì)象可以調(diào)用非const成員函數(shù)和const成員函數(shù)嗎名眉?

    不能粟矿,調(diào)用非const成員函數(shù)(如果調(diào)用非const則與const相矛盾);
    可以损拢,調(diào)用const成員函數(shù)陌粹。

非const對(duì)象可以調(diào)用非const成員函數(shù)和const成員函數(shù)嗎?

    都可以調(diào)用福压。

const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)和非const成員函數(shù)嗎掏秩?

    不能,調(diào)用其它的非const成員函數(shù)荆姆;
    可以蒙幻,調(diào)用其它的const成員函數(shù)。

非const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)和非const成員函數(shù)嗎胆筒?

    都可以調(diào)用邮破。

2. static

static的最主要功能是隱藏,其次因?yàn)閟tatic變量存放在靜態(tài)存儲(chǔ)區(qū)仆救,所以它具備持久性和默認(rèn)值0抒和。

static在C和C++中的區(qū)別:
C語(yǔ)言:
1。變量會(huì)被放在程序的全局存儲(chǔ)區(qū)中彤蔽,這樣可以在下一次調(diào)用的時(shí)候還可以保持原來(lái)的賦值摧莽。這一點(diǎn)是它與堆棧變量和堆變量的區(qū)別;
2.變量用static告知編譯器顿痪,自己僅僅在變量的作用范圍內(nèi)可見(jiàn)镊辕。這一點(diǎn)是它與全局變量的區(qū)別。
C++:
1员魏、靜態(tài)成員為所有類對(duì)象所共享丑蛤,不屬于某個(gè)具體的實(shí)例;
2撕阎、類靜態(tài)成員即可用類名::靜態(tài)成員或者對(duì)象.靜態(tài)成員來(lái)訪問(wèn)受裹;
3、類靜態(tài)成員變量必須在類外定義,定義時(shí)不添加static關(guān)鍵字棉饶;
4厦章、類的靜態(tài)成員函數(shù)沒(méi)有默認(rèn)的this指針,因此在它里面不能使用任何非靜態(tài)成員照藻。
5袜啃、靜態(tài)成員和類的普通成員一樣,也有public幸缕、protected群发、private3種訪問(wèn)級(jí)別,也可以具有返回值发乔,const修飾符等參數(shù)熟妓。
注意:
A.若全局變量?jī)H在單個(gè)文件中訪問(wèn),則可以將這個(gè)變量修改為靜態(tài)全局變量栏尚,以降低模塊間的耦合度起愈;
B.若全局變量?jī)H由單個(gè)函數(shù)訪問(wèn),則可以將這個(gè)變量改為該函數(shù)的靜態(tài)局部變量译仗,以降低模塊間的耦合度抬虽;
C.設(shè)計(jì)和使用訪問(wèn)動(dòng)態(tài)全局變量、靜態(tài)全局變量纵菌、靜態(tài)局部變量的函數(shù)時(shí)阐污,需要考慮重入問(wèn)題;
D.如果我們需要一個(gè)可重入的函數(shù)产艾,那么疤剑,我們一定要避免函數(shù)中使用static變量(這樣的函數(shù)被稱為:帶“內(nèi)部存儲(chǔ)器”功能的的函數(shù))
E.函數(shù)中必須要使用static變量情況:比如當(dāng)某函數(shù)的返回值為指針類型時(shí),則必須是static的局部變量的地址作為返回值闷堡,若為auto類型隘膘,則返回為錯(cuò)指針。

C++靜態(tài)成員函數(shù)問(wèn)題:
1.靜態(tài)成員函數(shù)可以調(diào)用非靜態(tài)成員函數(shù)嗎杠览?
不能弯菊;靜態(tài)成員函數(shù)沒(méi)有this指針,是所有類對(duì)象公有的踱阿。成員函數(shù)有this指針管钳,每個(gè)對(duì)象都有自己獨(dú)立的一份。在調(diào)用成員函數(shù)時(shí)软舌,實(shí)際上是this->成員函數(shù)才漆。一個(gè)類的靜態(tài)成員中去訪問(wèn)其非靜態(tài)成員之所以會(huì)出錯(cuò)是因?yàn)樵陬惖姆庆o態(tài)成員不存在的時(shí)候類的靜態(tài)成員就已經(jīng)存在了,訪問(wèn)一個(gè)內(nèi)存中不存在的東西當(dāng)然會(huì)出錯(cuò)佛点。
2.非靜態(tài)成員函數(shù)可以調(diào)用類的靜態(tài)成員函數(shù)嗎醇滥?
可以黎比;非靜態(tài)成員(變量和方法)屬于類的對(duì)象,所以只有在類的對(duì)象產(chǎn)生(創(chuàng)建類的實(shí)例)時(shí)才會(huì)分配內(nèi)存鸳玩,然后通過(guò)類的對(duì)象(實(shí)例)去訪問(wèn)阅虫。

3. extern

在C語(yǔ)言,用extern修飾符修飾的變量或者函數(shù)不跟,表示“此變量或者函數(shù)在其它文件已經(jīng)定義颓帝,在這里只做引用處理”。

// file.cpp
int num = 100;
// file2.cpp
#include <iostream>
using namespace std;
extern int num;
int main()
{
    cout << "num = " << num << endl;
    return 0;
}

編譯時(shí)窝革,將file.cpp 和 file2.cpp一起編譯购城,其運(yùn)行如下:

g++ file.cpp file2.cpp -o file //編譯
./file // 運(yùn)行執(zhí)行文件
num = 100

注意:
extern聲明的位置對(duì)其作用域也有關(guān)系,如果是在main函數(shù)中進(jìn)行聲明的虐译,則只能在main函數(shù)中調(diào)用工猜,在其它函數(shù)中不能調(diào)用。

// file3.cpp
#include <iostream>
using namespace std;
int sum_num()
{
    int sum = 0, b = 2;
    sum = num + b;
}

編譯時(shí)菱蔬,其運(yùn)行如下:

g++ file.cpp file2.cpp file3.cpp -o file //編譯
// 出現(xiàn)錯(cuò)誤提示,編譯不過(guò)去
// 在file3.cpp中num為定義
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末史侣,一起剝皮案震驚了整個(gè)濱河市拴泌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惊橱,老刑警劉巖蚪腐,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異税朴,居然都是意外死亡回季,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)正林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泡一,“玉大人,你說(shuō)我怎么就攤上這事觅廓”侵遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵杈绸,是天一觀的道長(zhǎng)帖蔓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瞳脓,這世上最難降的妖魔是什么塑娇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮劫侧,結(jié)果婚禮上埋酬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好奇瘦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布棘催。 她就那樣靜靜地躺著,像睡著了一般耳标。 火紅的嫁衣襯著肌膚如雪醇坝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天次坡,我揣著相機(jī)與錄音呼猪,去河邊找鬼。 笑死砸琅,一個(gè)胖子當(dāng)著我的面吹牛宋距,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播症脂,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谚赎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诱篷?” 一聲冷哼從身側(cè)響起壶唤,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棕所,沒(méi)想到半個(gè)月后闸盔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琳省,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年迎吵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片针贬。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡击费,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桦他,到底是詐尸還是另有隱情荡灾,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布瞬铸,位于F島的核電站批幌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗓节。R本人自食惡果不足惜荧缘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拦宣。 院中可真熱鬧截粗,春花似錦信姓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至珊蟀,卻和暖如春菊值,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背育灸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工腻窒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磅崭。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓儿子,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砸喻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柔逼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒(méi)有Protection行為...
    阿面a閱讀 7,635評(píng)論 0 10
  • const 引用 const 引用是指向 const 對(duì)象的引用:const int ival = 1024;co...
    rogerwu1228閱讀 617評(píng)論 0 1
  • 起床時(shí)間:5:40 運(yùn)動(dòng)項(xiàng)目:慢跑 成果:4 km割岛,32分鐘卒落,280大卡
    溫暖的小胖紙閱讀 499評(píng)論 0 50
  • 第一代寫(xiě)字樓 普通型商務(wù)寫(xiě)字樓 (50年代至80年代初) 第一代寫(xiě)字樓一般是指計(jì)劃經(jīng)濟(jì)體制下的行政辦公...
    夕陽(yáng)黃昏閱讀 1,029評(píng)論 0 0
  • 我不知道該怎么形容當(dāng)時(shí)的心情,當(dāng)我把口袋里的零錢放到那個(gè)大概站起來(lái)只有我膝蓋那么高的人的面前的盆里的時(shí)候蜂桶,我的鼻子...
    AliceTD閱讀 282評(píng)論 0 0