什么是构造函数及定义
什么是構(gòu)造函數(shù)
建立一個(gè)對(duì)象時(shí),通常最需要立即做的工作是初始化對(duì)象,如對(duì)數(shù)據(jù)成員賦初值
構(gòu)造函數(shù)就是用來在創(chuàng)造對(duì)象時(shí)初始化對(duì)象,為對(duì)象數(shù)據(jù)成員賦初始值
類的數(shù)據(jù)成員是不能在類的定義時(shí)初始化的,例如:
class Point { //Point類int x=0,y=0; //錯(cuò)誤,不能在類定義中對(duì)數(shù)據(jù)成員初始化... //其他成員 };原因是類的定義并沒有產(chǎn)生一個(gè)實(shí)體,而是給出了一個(gè)數(shù)據(jù)類型,不占用存儲(chǔ)空間,因而也無處容納數(shù)據(jù)
如果一個(gè)類中的所有的數(shù)據(jù)成員是公有的,則可以在定義對(duì)象時(shí)對(duì)數(shù)據(jù)成員進(jìn)行初始化,例如:
class Point { //Point類定義public:int x,y;... }; Point one = {10,10}; //對(duì)象初始化 Point A[3] = {{10,10},{20,20},{30,30}}; //對(duì)象數(shù)組初始化如果類中的數(shù)據(jù)成員是私有的,如private的或protected的,就不能用這種方法初始化,因?yàn)橥獠坎荒苤苯釉L問私有的數(shù)據(jù)成員
構(gòu)造函數(shù)的定義
C++提供了構(gòu)造函數(shù)(constructor)來處理對(duì)象的初始化問題。構(gòu)造函數(shù)是類的一種特殊成員函數(shù),不需要人為調(diào)用,而是在建立對(duì)象時(shí)自動(dòng)被執(zhí)行。
換言之,在建立對(duì)象時(shí)構(gòu)造函數(shù)就被自動(dòng)執(zhí)行了,程序員因此有機(jī)會(huì)在這里進(jìn)行對(duì)象的初始化工作。
C++規(guī)定構(gòu)造函數(shù)的名字與類的名字相同,而且不能指定返回類型。
定義形式為:
構(gòu)造函數(shù)可以沒有形參,有如下兩種形式:
類名() {函數(shù)體 } 類名(void) {函數(shù)體 }與其他任何函數(shù)一樣,構(gòu)造函數(shù)可以聲明為內(nèi)聯(lián)的。
只要?jiǎng)?chuàng)建類類型的新對(duì)象,都要執(zhí)行構(gòu)造函數(shù)。因此,構(gòu)造函數(shù)的主要用途是初始化類的數(shù)據(jù)成員。
對(duì)于有參數(shù)的構(gòu)造函數(shù),定義對(duì)象的一般形式為:
類名 對(duì)象名1(實(shí)參列表),對(duì)象名2(實(shí)參列表),.....;對(duì)于無參數(shù)的構(gòu)造函數(shù),定義對(duì)象的一般形式為:
類名 對(duì)象名1,對(duì)象名2,.....;構(gòu)造函數(shù)舉例:
#include<iostream> using namespace std;class Cuboid { //Cuboid類表示長(zhǎng)方體public:Cuboid(int l,int h,int d); //構(gòu)造函數(shù)int volumn() {return length*height*depth;}private:int length,height,depth; //長(zhǎng),高,深 };Cuboid::Cuboid(int l,int h,int d) { //外部定義的構(gòu)造函數(shù)length=l;height=h;depth=d;cout<<"Cuboid:"<<"L="<<l<<",H="<<h<<",D="<<d<<endl; }int main() {Cuboid a(1,2,3); //定義長(zhǎng)方體對(duì)象a,調(diào)用構(gòu)造函數(shù)初始化cout<<" volumn="<<a.volumn()<<endl;Cuboid b(10,20,30; //定義長(zhǎng)方體對(duì)象b,調(diào)用構(gòu)造函數(shù)初始化cout<<" volumn="<<b.volumn()<<endl;return 0; }關(guān)于構(gòu)造函數(shù)的說明:
(1)構(gòu)造函數(shù)是在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行的,而且只執(zhí)行一次,并先于其他成員函數(shù)執(zhí)行。構(gòu)造函數(shù)不需要人為調(diào)用,也不能被人為調(diào)用。
(2)構(gòu)造函數(shù)一般聲明為公有的(public),因?yàn)閯?chuàng)建對(duì)象通常是在類的外部進(jìn)行的。如果構(gòu)造函數(shù)聲明為保護(hù)的(protected)或私有的(private),那就意味在類外部創(chuàng)建對(duì)象(并調(diào)用構(gòu)造函數(shù))是錯(cuò)誤的。換言之,這樣的類是不能由外部實(shí)例化,只能由類內(nèi)部實(shí)例化,這種情況不是通常的做法。
(3)在構(gòu)造函數(shù)的函數(shù)體中不僅可以對(duì)數(shù)據(jù)成員初始化,而且可以包含任意其他功能的語句,例如分配動(dòng)態(tài)內(nèi)存等,但是一般不提倡在構(gòu)造函數(shù)中加入與初始化無關(guān)的內(nèi)容。
(4)每個(gè)構(gòu)造函數(shù)應(yīng)該為每個(gè)數(shù)據(jù)成員提供初始化。否則將使那些數(shù)據(jù)成員處于未定義的狀態(tài)。而使用一個(gè)未定義的成員是錯(cuò)誤的。
(5)帶參數(shù)的構(gòu)造函數(shù)中的形參,是在定義對(duì)象時(shí)由對(duì)應(yīng)的實(shí)參給定的,用這種方法可以方便地實(shí)現(xiàn)對(duì)不同對(duì)象進(jìn)行不同的初始化。需要注意,實(shí)參必須與構(gòu)造函數(shù)的形參的個(gè)數(shù),次序,類型一致。
與普通函數(shù)一樣,構(gòu)造函數(shù)具有函數(shù)名,形參列表和函數(shù)體。與其他函數(shù)不同的是,構(gòu)造函數(shù)可以包含一個(gè)構(gòu)造函數(shù)初始化列表,一般形式為:
與其它的成員函數(shù)一樣,構(gòu)造函數(shù)可以定義在類的內(nèi)部或外部,但構(gòu)造函數(shù)初始化列表只在構(gòu)造函數(shù)的定義中而不是函數(shù)原型聲明中指定。
從初始化角度來看,可以人為構(gòu)造函數(shù)分為兩個(gè)階段執(zhí)行:(1)初始化階段;(2)普通的計(jì)算階段。初始化階段由構(gòu)造函數(shù)初始化列表組成,計(jì)算階段由構(gòu)造函數(shù)函數(shù)體的所有語句組成,初始化階段先于普通的計(jì)算階段。即:
構(gòu)造函數(shù)初始化列表舉例:
#include<iostream> using namespace std;class Cuboid { //Cuboid類表示長(zhǎng)方體public:Cuboid(int l,int h,int d); //構(gòu)造函數(shù)int volumn() {return length*height*depth;}private:int length,height,depth; //長(zhǎng),寬,深 };Cuboid::Cuboid(int l,int h,int d) :length(l),height(h),depth(d) // 帶構(gòu)造函數(shù)初始化列表的構(gòu)造函數(shù) {cout<<"Cuboid:"<<"L="<<l<<",H="<<h<<",D="<<d<<endl; }關(guān)于構(gòu)造函數(shù)初始化列表的說明:
(1)有時(shí)必須用構(gòu)造函數(shù)初始化列表
- 如果沒有為類類型的數(shù)據(jù)成員提供初始化列表,編譯器會(huì)隱式的地使用該成員的默認(rèn)構(gòu)造函數(shù)。如果那個(gè)類沒有默認(rèn)構(gòu)造函數(shù),則編譯器會(huì)報(bào)告錯(cuò)誤。在這種情況下,為了初始化類類型的數(shù)據(jù)成員,必須提供初始化列表。
- 一般地,沒有默認(rèn)構(gòu)造函數(shù)的成員,以及const或引用類型的成員,都必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化。
(2)成員初始化的次序
- 每個(gè)成員在構(gòu)造函數(shù)初始化列表中只能指定一次,但構(gòu)造函數(shù)初始化列表僅指定用于初始化的數(shù)據(jù)成員的值,并不指定這些初始化執(zhí)行次序。數(shù)據(jù)成員被初始化的次序就是數(shù)據(jù)成員的聲明次序。第1個(gè)成員首先被初始化,然后是第2個(gè),以此類推。
- 一般地,按照與成員聲明一致的次序編寫構(gòu)造函數(shù)初始化列表,并且盡可能避免使用成員來初始化其他成員。
(3)初始化式可以是任意表達(dá)式
總結(jié)
以上是生活随笔為你收集整理的什么是构造函数及定义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优化云介绍
- 下一篇: kuma相关istio