在本文中,您將學(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)行初始化。
編譯器通過其名稱和返回類型將給定的成員函數(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來處理面積相關(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)寬度。
然后,通過調(diào)用AreaCalculation()函數(shù)計(jì)算對(duì)象A1的面積,并將其存儲(chǔ)在變量temp中,最后顯示出來。
對(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ù)來執(zhí)行這個(gè)任務(wù)。但是,不需要額外的構(gòu)造函數(shù)。這是因?yàn)槟J(rèn)情況下,復(fù)制構(gòu)造函數(shù)已經(jīng)內(nèi)置到所有類中。