C++中類的構(gòu)造函數(shù)初始值列表解讀
C++類的構(gòu)造函數(shù)初始值列表
1 通過構(gòu)造函數(shù)初始值列表來初始化成員變量
C++中類的構(gòu)造函數(shù)初始值列表可以對(duì)類的成員進(jìn)行初始化。
class myClass{
? public:
? int i;
? myClass(): i(1)
? {
? }
};其中,類myClass的構(gòu)造函數(shù)中包含了初始值列表,對(duì)成員變量i進(jìn)行初始化。
2 通過構(gòu)造函數(shù)的函數(shù)體來初始化成員變量
除了通過構(gòu)造函數(shù)初始值列表來初始化成員變量外,還可以通過構(gòu)造函數(shù)的函數(shù)體來初始化成員變量。
class myClass{
? public:
? int i;
? myClass()
? {
? ? i = 1;
? }
};此時(shí),成員變量i的初始值是1。
3 類包含常量或引用成員變量
當(dāng)類包含有常量成員變量或者引用成員變量時(shí)
class myClass{
public:
? int i;
? const int ci;
? int& ri;
};如果類沒有定義構(gòu)造函數(shù),則使用默認(rèn)的構(gòu)造函數(shù)來創(chuàng)建對(duì)象
myClass mc;
此時(shí),編譯器會(huì)報(bào)錯(cuò),報(bào)錯(cuò)信息為“error C2280: “myClass::myClass(void)”: 嘗試引用已刪除的函數(shù)”。因此,需要編寫myClass類的構(gòu)造函數(shù)對(duì)常量成員變量和引用成員變量進(jìn)行初始化。
3.1 不能在構(gòu)造函數(shù)的函數(shù)體來初始化常量或引用成員變量
在myClass類的構(gòu)造函數(shù)體內(nèi)對(duì)常量或引用成員變量進(jìn)行初始化
myClass()
{
? i = 1;
? ci = 2;
? ri = i;
}此時(shí),編譯器會(huì)報(bào)錯(cuò),報(bào)錯(cuò)信息為“ error C2789: “myClass::ci”: 必須初始化常量限定類型的對(duì)象”。
3.2 在類的構(gòu)造函數(shù)初始值列表來初始化常量或引用成員變量
myClass():i(1),ci(2),ri(i)
{
}此時(shí),程序可以成功編譯。
C++類的構(gòu)造函數(shù)的作用
構(gòu)造函數(shù)的作用
為了解決給對(duì)象成員初始化賦值的問題,C++提供了“構(gòu)造函數(shù)(constructor)”來處理對(duì)象的初始化。構(gòu)造函數(shù)是一種特殊的成員函數(shù),與其他成員函數(shù)不同,不需要用戶來調(diào)用它,而是在建立對(duì)象時(shí)自動(dòng)執(zhí)行。
構(gòu)造函數(shù)的名字必須與類名同名,而不能由用戶任意命名,以便編譯系統(tǒng)能識(shí)別它并把它作為構(gòu)造函數(shù)處理。構(gòu)造函數(shù)不返回任何值,所以,函數(shù)沒有返回類型。
例如,定義一個(gè)C++類,類名是 student,如下:
class student?????? //以class開頭
{?? ... };那么,構(gòu)造函數(shù)的函數(shù)名與類名相同,所以,構(gòu)造函數(shù)的函數(shù)名是student,例如:
student();????????????????????? //沒有參數(shù)的構(gòu)造構(gòu)造函數(shù); student(char* name);???? //帶參數(shù)的構(gòu)造函數(shù);
構(gòu)造函數(shù)的功能是由用戶定義的,用戶根據(jù)初始化的要求設(shè)計(jì)函數(shù)體和函數(shù)參數(shù)。
在講解構(gòu)造函數(shù)之前,我們先寫一個(gè)例子,測(cè)試構(gòu)造函數(shù)的使用。
測(cè)試代碼如下:

程序的運(yùn)行結(jié)果有:

在類student中定義了構(gòu)造函數(shù):
student(char* pn, char* pa, long long n);
構(gòu)造函數(shù)的名稱和所在的類同名。在建立對(duì)象時(shí)自動(dòng)執(zhí)行構(gòu)造函數(shù),它的作用是對(duì)定義的對(duì)象進(jìn)行初始化。例如給成員變量賦初值,賦值語(yǔ)句是寫在構(gòu)造函數(shù)的函數(shù)體中,只有在調(diào)用構(gòu)造函數(shù)的時(shí)候,才執(zhí)行這些賦值語(yǔ)句,為當(dāng)前對(duì)象的成員變量賦值。
在上面的例子中,我們定義了stud對(duì)象,在定義對(duì)象的同時(shí),給對(duì)象的成員變量賦值。
定義對(duì)象如下:
student stud("wkf", "www.mylinux.vip", 13926572996);此時(shí),定義stud對(duì)象,給對(duì)象設(shè)置3個(gè)數(shù)據(jù),根據(jù)這些數(shù)據(jù)的類型,就調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù):
student(char* pn, char* pa, long long n);
所以,把參數(shù)設(shè)置到對(duì)應(yīng)的構(gòu)造函數(shù)中,如下:
pn = "wkf"; pa = "www.mylinux.vip"; n = 13926572996;
給構(gòu)造函數(shù)的參數(shù)設(shè)置數(shù)據(jù)之后,就執(zhí)行構(gòu)造函數(shù)。
上面是在類內(nèi)定義構(gòu)造函數(shù),也可以只在類內(nèi)對(duì)構(gòu)造函數(shù)進(jìn)行聲明,而在類外定義構(gòu)造函數(shù)。在類外定義構(gòu)造函數(shù),如下:

可以看到,把student(char* pn, char* pa, long long n);構(gòu)造函數(shù)放在類外定義。
有關(guān)構(gòu)造函數(shù)的使用,有以下說明:
(1) 構(gòu)造函數(shù)的名稱,與類名一樣。
(2) 什么時(shí)候調(diào)用構(gòu)造函數(shù)?定義類對(duì)象的時(shí)候,開始構(gòu)建對(duì)象,調(diào)用類的構(gòu)造函數(shù)。
(3) 構(gòu)造函數(shù)沒有返回值,因此,也不需要在定義構(gòu)造函數(shù)時(shí)聲明函數(shù)返回類型,這是它和一般函數(shù)的一個(gè)重要的不同之點(diǎn),不能寫成:
void student ()
{.....}構(gòu)造函數(shù)的作用主要是用來對(duì)對(duì)象進(jìn)行初始化。
(4) 構(gòu)造函數(shù)是建立對(duì)象時(shí)由系統(tǒng)自動(dòng)執(zhí)行的,而且只執(zhí)行一次。所以,構(gòu)造函數(shù)不能夠由用戶調(diào)用。
(5) 在構(gòu)造函數(shù)的函數(shù)體中不僅可以對(duì)成員變量賦初值,而且,可以包含其他語(yǔ)句,例如cout語(yǔ)句。但是,一般不提倡在構(gòu)造函數(shù)中加入與初始化無關(guān)的內(nèi)容。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn)
本文主要介紹了C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
win10環(huán)境下C++ vs2015編譯opencv249的教程
這篇文章主要介紹了win10環(huán)境下C++ vs2015編譯opencv249的教程,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Qt實(shí)現(xiàn)TCP同步與異步讀寫消息的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何在?Qt?中實(shí)現(xiàn)?TCP?客戶端和服務(wù)器的同步和異步讀寫消息,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
C++類和對(duì)象深入探索之分文件編寫點(diǎn)和圓的關(guān)系詳解
先前把C++類和對(duì)象的封裝講完了,并且留下了一個(gè)判斷兩個(gè)立方體是否相等的案例,但是那么多知識(shí)點(diǎn),僅僅一個(gè)案例是不夠的,所以再來一個(gè)分文件編寫點(diǎn)圓關(guān)系的案例;創(chuàng)建圓類和點(diǎn)類,圓類包含點(diǎn)類,算是一個(gè)嵌套吧,順便復(fù)習(xí)一下分文件編寫的方法,開整2022-05-05
QT連接Mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)步驟
本文主要介紹了QT連接Mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

