C++普通變量纸肉、C++靜態(tài)成員變量、C++成員常量喊熟、C++靜態(tài)成員常量的初始化方法

轉(zhuǎn)載:[https://blog.csdn.net/buknow/article/details/80275191(https://blog.csdn.net/buknow/article/details/80275191)
最近復(fù)習(xí)C++的一些知識柏肪,遇到了一個我比較容易混淆、傻傻分不清的知識點芥牌,那就是C++的變量的類型初始化或賦初值烦味,大致有普通成員變量、靜態(tài)成員變量壁拉、成員常量這三種拐叉,還有一種組合的靜態(tài)成員常量。
看到這幾種數(shù)據(jù)成員時很尷尬扇商,經(jīng)常就把某兩種搞混了,所以為了方便和好理解宿礁,在前輩的基礎(chǔ)上做個小總結(jié)案铺。
為了直觀簡潔的呈現(xiàn)這種對比,采用代碼對比的方式完成這個事情梆靖。包括四種數(shù)據(jù)成員控汉,進(jìn)行四種初始化笔诵、賦初值作對比。代碼如下:

#include<iostream>
#include<string.h>
using namespace std;
// 四種數(shù)據(jù)成員:1.常量數(shù)據(jù)成員const 2.靜態(tài)數(shù)據(jù)成員static 3.普通數(shù)據(jù)成員(normal) 4.靜態(tài)成員常量static const
// 四種賦值方式:1.直接初始化(在聲明時就賦值) 2.先聲明再通過初始化列表賦初值 3.先聲明再在構(gòu)造函數(shù)體里賦初值 4.先聲明再在類外賦初值
class Example{
public:
    const int i_const_1 = 10;
    const int i_const_2;
    const int i_const_3;
    const int i_const_4;
 
    //static int i_static_1 = 10;// Error:帶有類內(nèi)初始值設(shè)定項的成員必須為常量
    static int i_static_2;
    static int i_static_3;
    static int i_static_4;
 
    int i_normal_1 = 10;
    int i_normal_2;
    int i_normal_3;
    int i_normal_4;
 
    static const int i_sta_con_1 = 10;//  static const int i_sta_con_1 = 10; 在這里初始化也可以
    static const int i_sta_con_2;
    static const int i_sta_con_3;
    static const int i_sta_con_4;
 
    Example(int t)
        : i_const_2(t)
        //, i_static_2(t)// Error:不是類"Example"的非靜態(tài)數(shù)據(jù)成員或基類
        , i_normal_2(t)
 
        // /* // Error:"Example::Example(int t)"未提供初始值設(shè)定項:常量 成員"Example::i_const_3" 常量 成員"Example::i_const_4"
        , i_const_3(t)
        , i_const_4(t)
//        , i_sta_con_2(t)  //ERROR:因為是靜態(tài)數(shù)據(jù)成員姑子,所以不能在構(gòu)造函數(shù)的初始化列表處初始化靜態(tài)常量乎婿,因為構(gòu)造函數(shù)可能會被多次調(diào)用的,而靜態(tài)數(shù)據(jù)只能被初始化一次
        // */
    {
        // i_const_3 = 10;// Error:表達(dá)式必須是可修改的左值
        // i_static_3 = 10; // error LNK2001: 無法解析的外部符號
        i_normal_3 = 10;
//        i_sta_con_3 = 10; //ERROR:因為是靜態(tài)數(shù)據(jù)成員街佑,所以不能在構(gòu)造函數(shù)內(nèi)初始化靜態(tài)常量谢翎,因為構(gòu)造函數(shù)可能會被多次調(diào)用的,而靜態(tài)數(shù)據(jù)只能被初始化一次
    }
};
//int example::i_const_4 = 10;// Error:非靜態(tài)的類數(shù)據(jù)成員不能在其類的外部定義
int Example::i_static_4 = 10;
//int example::i_normal_4 = 10;// Error:非靜態(tài)的類數(shù)據(jù)成員不能在其類的外部定義
//int Example::i_sta_con_4 = 10;  //Error:(不知道為什么不行???)
const int Example::i_sta_con_4 = 10;
int main()
{
    Example e(10);
 
    cout << "i_const_1: " << e.i_const_1 << endl;
    cout << "i_const_2: " << e.i_const_2 << endl;
 
    cout << "i_static_4: " << e.i_const_4 << endl;
 
    cout << "i_normal_1: " << e.i_normal_1 << endl;
    cout << "i_normal_2: " << e.i_normal_2 << endl;
    cout << "i_normal_3: " << e.i_normal_3 << endl;
 
    cout << "i_sta_con_1: " << e.i_sta_con_1 << endl;
    cout << "i_sta_con_4: " << e.i_sta_con_1 << endl;
 
    return 0;
}

運(yùn)行結(jié)果如圖:

image.png

由此可以很清晰的看到沐旨,不同的數(shù)據(jù)成員有著不同的初始化方式森逮。為了更直觀點,做個表對比磁携。

image.png

數(shù)據(jù)成員類型 normal const static static const
類內(nèi)直接初始化(在聲明時就賦值) √ √ × √
先聲明再通過初始化列表賦初值 √ √ × ×
先聲明再在構(gòu)造函數(shù)體里賦初值 √ × × ×
先聲明再在類外賦初值 × × √ √
還有問題:

1.因為在類聲明時褒侧,并沒有實例化對象,也就是沒有分配內(nèi)存谊迄,所以C++的成員常量的初始化只能在構(gòu)造函數(shù)的初始化列表中進(jìn)行闷供,但是本文中上述的代碼“const int i_const_1 = 10;”即直接在類體內(nèi)初始化數(shù)據(jù)常量,經(jīng)過測試也沒報錯答案也正確统诺,這是為什么呢歪脏?

//int Example::i_sta_con_4 = 10;  //Error:(不知道為什么不行???)
const int Example::i_sta_con_4 = 10;

最后的靜態(tài)常量用第二種方法賦初值時,直接賦值不可行篙议,報錯誤唾糯,必須要加上const關(guān)鍵字限定,然后就可以順利賦初值鬼贱,不曉得為什么移怯?有大佬可以解釋解釋嗎?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末这难,一起剝皮案震驚了整個濱河市舟误,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姻乓,老刑警劉巖嵌溢,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹋岩,居然都是意外死亡赖草,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門剪个,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧骑,“玉大人,你說我怎么就攤上這事『跽郏” “怎么了绒疗?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骂澄。 經(jīng)常有香客問我吓蘑,道長,這世上最難降的妖魔是什么坟冲? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任磨镶,我火速辦了婚禮,結(jié)果婚禮上樱衷,老公的妹妹穿的比我還像新娘棋嘲。我一直安慰自己,他們只是感情好矩桂,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布沸移。 她就那樣靜靜地躺著,像睡著了一般侄榴。 火紅的嫁衣襯著肌膚如雪雹锣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天癞蚕,我揣著相機(jī)與錄音蕊爵,去河邊找鬼。 笑死桦山,一個胖子當(dāng)著我的面吹牛攒射,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恒水,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼会放,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钉凌?” 一聲冷哼從身側(cè)響起咧最,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎御雕,沒想到半個月后矢沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酸纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年捣鲸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闽坡。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡摄狱,死狀恐怖脓诡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媒役,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布宪迟,位于F島的核電站酣衷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏次泽。R本人自食惡果不足惜穿仪,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望意荤。 院中可真熱鬧啊片,春花似錦、人聲如沸玖像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐寥。三九已至笤昨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間握恳,已是汗流浹背瞒窒。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留乡洼,地道東北人崇裁。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像束昵,于是被迫代替她去往敵國和親拔稳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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