在本文中,您將學(xué)習(xí)C ++中的構(gòu)造函數(shù)。您將學(xué)習(xí)什么是構(gòu)造函數(shù),如何創(chuàng)建它以及C ++中的構(gòu)造函數(shù)類型。
構(gòu)造函數(shù)是成員函數(shù)的一種特殊類型,它在創(chuàng)建對(duì)象時(shí)會(huì)自動(dòng)對(duì)其進(jìn)行初始化。
編譯器通過(guò)其名稱和返回類型將給定的成員函數(shù)標(biāo)識(shí)為構(gòu)造函數(shù)。
構(gòu)造函數(shù)與該類具有相同的名稱,并且沒有任何返回類型。同樣,構(gòu)造函數(shù)始終是公共的。
... .. ...
class temporary
{
private:
int x;
float y;
public:
// 構(gòu)造函數(shù)
temporary(): x(5), y(5.5)
{
// 構(gòu)造函數(shù)體
}
... .. ...
};
int main()
{
Temporary t1;
... .. ...
}上面的程序顯示了定義的構(gòu)造函數(shù),沒有返回類型,并且名稱與類相同。
在上面的代碼中,temporary()是一個(gè)構(gòu)造函數(shù)。
創(chuàng)建類的對(duì)象時(shí),將自動(dòng)調(diào)用構(gòu)造函數(shù)temporary,并將x其初始化為5,然后y初始化為5.5。
您還可以按以下方式初始化構(gòu)造函數(shù)體內(nèi)的數(shù)據(jù)成員。但是,這種不推薦使用此方法。
temporary()
{
x = 5;
y = 5.5;
}
// 這種方法不是首選的。假設(shè)您正在處理100個(gè)Person對(duì)象,并且數(shù)據(jù)成員age的默認(rèn)值為0。手動(dòng)初始化所有對(duì)象將是一項(xiàng)非常繁瑣的任務(wù)。
相反,您可以定義一個(gè)初始化age為0 的構(gòu)造函數(shù)。然后,您要做的就是創(chuàng)建一個(gè)Person對(duì)象,構(gòu)造函數(shù)將自動(dòng)初始化age。
這些情況在處理對(duì)象數(shù)組時(shí)經(jīng)常出現(xiàn)。
另外,如果要在創(chuàng)建對(duì)象后立即執(zhí)行一些代碼,可以將代碼放在構(gòu)造函數(shù)的主體內(nèi)。
計(jì)算并顯示矩形的面積。
#include <iostream>
using namespace std;
class Area
{
private:
int length;
int breadth;
public:
// 構(gòu)造函數(shù)
Area(): length(5), breadth(2){ }
void GetLength()
{
cout << "分別輸入長(zhǎng)度和寬度: ";
cin >> length >> breadth;
}
int AreaCalculation() { return (length * breadth); }
void DisplayArea(int temp)
{
cout << "面積: " << temp;
}
};
int main()
{
Area A1, A2;
int temp;
A1.GetLength();
temp = A1.AreaCalculation();
A1.DisplayArea(temp);
cout << endl << "不從用戶那里獲取值時(shí)的默認(rèn)面積為:" << endl;
temp = A2.AreaCalculation();
A2.DisplayArea(temp);
return 0;
}在這個(gè)程序中,創(chuàng)建類Area來(lái)處理面積相關(guān)的函數(shù)。它有兩個(gè)數(shù)據(jù)成員length和breadth。
定義了一個(gè)初始化length為5和breadth為2的構(gòu)造函數(shù)。
我們還具有三個(gè)附加的成員函數(shù)GetLength(), AreaCalculation() 和 DisplayArea(),分別從用戶處獲取長(zhǎng)度,計(jì)算面積以及顯示面積。
當(dāng)創(chuàng)建對(duì)象A1和A2時(shí),由于構(gòu)造函數(shù)的關(guān)系,這兩個(gè)對(duì)象的長(zhǎng)度(length)和(breadth)寬度分別初始化為5和2。
然后,調(diào)用成員函數(shù)GetLength(),該函數(shù)從用戶那里獲取對(duì)象A1的長(zhǎng)度(length)和(breadth)寬度值。 這改變了對(duì)象A1的長(zhǎng)度(length)和(breadth)寬度。
然后,通過(guò)調(diào)用AreaCalculation()函數(shù)計(jì)算對(duì)象A1的面積,并將其存儲(chǔ)在變量temp中,最后顯示出來(lái)。
對(duì)于對(duì)象A2,不要求用戶提供任何數(shù)據(jù)。 因此,長(zhǎng)度(length)和(breadth)寬度分別保持5和2。
然后,計(jì)算并顯示A2的面積為10。
輸出結(jié)果
分別輸入長(zhǎng)度和寬度: 6 7 面積: 42 不從用戶那里獲取值時(shí)的默認(rèn)面積為: 面積: 10
構(gòu)造函數(shù)也可以類似于函數(shù)重載的方式重載。
重載的構(gòu)造函數(shù)具有相同的名稱(類的名稱),但參數(shù)個(gè)數(shù)不同。
根據(jù)傳遞的參數(shù)的個(gè)數(shù)和類型,將調(diào)用特定的構(gòu)造函數(shù)。
由于存在多個(gè)構(gòu)造函數(shù),因此在創(chuàng)建對(duì)象時(shí)也應(yīng)傳遞構(gòu)造函數(shù)的參數(shù)。
// 源代碼演示重載的構(gòu)造函數(shù)的工作原理
#include <iostream>
using namespace std;
class Area
{
private:
int length;
int breadth;
public:
// 無(wú)參數(shù)構(gòu)造函數(shù)
Area(): length(5), breadth(2) { }
// 有兩個(gè)參數(shù)的構(gòu)造函數(shù)
Area(int l, int b): length(l), breadth(b){ }
void GetLength()
{
cout << "分別輸入長(zhǎng)度和寬度: ";
cin >> length >> breadth;
}
int AreaCalculation() { return length * breadth; }
void DisplayArea(int temp)
{
cout << "面積: " << temp << endl;
}
};
int main()
{
Area A1, A2(2, 1);
int temp;
cout << "沒有傳遞參數(shù)時(shí)的默認(rèn)面積。" << endl;
temp = A1.AreaCalculation();
A1.DisplayArea(temp);
cout << "(2,1)作為參數(shù)傳遞時(shí)的面積。" << endl;
temp = A2.AreaCalculation();
A2.DisplayArea(temp);
return 0;
}對(duì)于對(duì)象A1,創(chuàng)建對(duì)象時(shí)不傳遞任何參數(shù)。
因此,將調(diào)用不帶參數(shù)的構(gòu)造函數(shù),該構(gòu)造函數(shù)將長(zhǎng)度(length)初始化為5,寬度(breadth)初始化為2。因此,對(duì)象A1的面積將為10。
對(duì)于對(duì)象A2,在創(chuàng)建對(duì)象時(shí)將2和1作為參數(shù)傳遞。
因此,將調(diào)用具有兩個(gè)參數(shù)的構(gòu)造函數(shù),該構(gòu)造函數(shù)將長(zhǎng)度(length)初始化為l(在這種情況下為2),并將寬度(breadth)初始化為b(在這種情況下為1)。 因此,對(duì)象A2的面積將為2。
輸出結(jié)果
沒有傳遞參數(shù)時(shí)的默認(rèn)面積。 面積: 10 (2,1)作為參數(shù)傳遞時(shí)的面積。 面積: 2
一個(gè)對(duì)象可以用另一個(gè)相同類型的對(duì)象初始化。這與將一個(gè)類的內(nèi)容復(fù)制到另一個(gè)類是一樣的。
在上面的程序中,如果你想初始化一個(gè)對(duì)象A3,使它包含與A2相同的值,可以這樣執(zhí)行:
....
int main()
{
Area A1, A2(2, 1);
// 將A2的內(nèi)容復(fù)制到A3
Area A3(A2);
OR,
Area A3 = A2;
}您可能會(huì)想,您需要?jiǎng)?chuàng)建一個(gè)新的構(gòu)造函數(shù)來(lái)執(zhí)行這個(gè)任務(wù)。但是,不需要額外的構(gòu)造函數(shù)。這是因?yàn)槟J(rèn)情況下,復(fù)制構(gòu)造函數(shù)已經(jīng)內(nèi)置到所有類中。