C++深入講解初始化列表的用法
一、小問題
下面的類定義是否合法? 如果合法,ci 的值是什么,存儲(chǔ)在哪里?

下面編寫代碼一探究竟(代碼1):
#include <stdio.h>
class Test
{
private:
const int ci;
public:
Test()
{
ci = 10;
}
int getCI()
{
return ci;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
return 0;
}可以看到,編譯報(bào)錯(cuò),ci 沒有被初始化,如果要初始化,就得在 test() 那里進(jìn)行,且看下節(jié)初始化列表。

二、類成員的初始化
C++ 中提供了初始化列表對(duì)成員變量進(jìn)行初始化
語法規(guī)則

所以代碼 1 可以寫成:
#include <stdio.h>
class Test
{
private:
const int ci;
public:
Test() : ci(10)
{
//ci = 10;
}
int getCI()
{
return ci;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
return 0;
}這樣編譯就能通過,得到想要的結(jié)果:

注意事項(xiàng)
- 成員的初始化順序與成員的聲明順序相同
- 成員的初始化順序與初始化列表中的位置無關(guān)
- 初始化列表先于構(gòu)造函數(shù)的函數(shù)體執(zhí)行
下面看一段初始化列表使用的代碼:
#include <stdio.h>
class Value
{
private:
int mi;
public:
Value(int i)
{
printf("i = %d\n", i);
mi = i;
}
int getI()
{
return mi;
}
};
class Test
{
private:
Value m2;
Value m3;
Value m1;
public:
Test() : m1(1), m2(2), m3(3)
{
printf("Test::Test()\n");
}
};
int main()
{
Test t;
return 0;
}輸出結(jié)果如下:

這段代碼很好的將上面的注釋事項(xiàng)體現(xiàn)出來了,初始化順序是 m1,m2,m3,輸出順序確是 m2,m3,m1,并且構(gòu)造函數(shù)的函數(shù)體后于初始化列表的執(zhí)行。
三、類中的 const 成員
- 類中的 const 成員會(huì)被分配空間的
- 類中的 const 成員的本質(zhì)是只讀變量
- 類中的 const 成員只能在初始化列表中指定初始值
編譯器無法直接得到 const 成員的初始值,因此無法進(jìn)入符號(hào)表成為真正意義上的常量。
下面看一段代碼:
#include <stdio.h>
class Value
{
private:
int mi;
public:
Value(int i)
{
printf("i = %d\n", i);
mi = i;
}
int getI()
{
return mi;
}
};
class Test
{
private:
const int ci;
Value m2;
Value m3;
Value m1;
public:
Test() : m1(1), m2(2), m3(3), ci(100)
{
printf("Test::Test()\n");
}
int getCI()
{
return ci;
}
int setCI(int v)
{
int* p = const_cast<int*>(&ci);
*p = v;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
t.setCI(10);
printf("t.ci = %d\n", t.getCI());
return 0;
}下面為輸出結(jié)果:

這段代碼說明 const 不是真正意義上的常量,只是只讀變量。
四、初始化與賦值的不同
- 初始化:對(duì)正在創(chuàng)建的對(duì)象進(jìn)行初值設(shè)置
- 賦:對(duì)已經(jīng)存在的對(duì)象進(jìn)行值設(shè)置
五、小結(jié)
- 類中可以使用初始化列表對(duì)成員進(jìn)行初始化
- 初始化列表先于構(gòu)造函數(shù)體執(zhí)行
- 類中可以定義 const 成員變量
- const 成員變量必須在初始化列表中指定初值
- const 成員變量為只讀變量
到此這篇關(guān)于C++深入講解初始化列表的用法的文章就介紹到這了,更多相關(guān)C++ 初始化列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法
今天小編就為大家分享一篇關(guān)于C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式
本文主要介紹了QTreeWidget隱藏節(jié)點(diǎn)的兩種方式,一種是直接隱藏,一種是間接隱藏,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送2023-02-02
C語言SetConsoleTextAttribute函數(shù)使用方法
這篇文章介紹了C語言SetConsoleTextAttribute函數(shù)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

