目的:為了使用戶定義的數(shù)據(jù)類(lèi)型如同一般數(shù)據(jù)類(lèi)型一樣使用。
功能:對(duì)對(duì)象進(jìn)行初始化,有若干種方法。
特點(diǎn):1、無(wú)返回值說(shuō)明;2、不能繼承;3、可以有缺省參數(shù);4、不能取地址,構(gòu)造時(shí)自動(dòng)給對(duì)象分配棧中內(nèi)存,析構(gòu)時(shí)回收;
5、自動(dòng)調(diào)用構(gòu)造函數(shù)。
構(gòu)造函數(shù)是類(lèi)的一個(gè)特殊成員函數(shù),其函數(shù)名同類(lèi)名一樣。C++通過(guò)構(gòu)造函數(shù)可以正確地初始化對(duì)象。構(gòu)造函數(shù)不能被顯式調(diào)用,不能使
虛函數(shù)。
例: class queue {
int q[100]; //默認(rèn)為private
int sloc,rloc;
public:
queue();
void qput(int i);
};
queue ::queue () //隱式調(diào)用
{
sloc=rloc=0;
}
int queue ::qput (int i){}
main()
{
queue a,b;
a.qput (10);
b.qput (20);
}
參數(shù)化的構(gòu)造函數(shù):
queue ::queue (int vx,int vy){} };
main()
{
queue a(10,20);
}
缺省參數(shù)的構(gòu)造函數(shù):特殊情況下需要傳遞參數(shù),一般都是用缺省參數(shù)。
單個(gè)參數(shù):queue ::queue (int i=16) {} };
main()
{
queue a;
}
多個(gè)參數(shù):queue ::queue (int vx=0,int vy=0) {}
缺省參數(shù)還可用于一般成員函數(shù)。使用時(shí)應(yīng)注意避免二義性。
多構(gòu)造函數(shù):
public:
queue ( );
queue (int );
queue (int,char );
};
main()
{
queue a;
queue b(1);
queue c(1,'c'); //避免二義性
}
拷貝構(gòu)造函數(shù):
1、系統(tǒng)產(chǎn)生:
queue ::queue (int vx,int vy){} };
main() { queue a(b) ; }
2、自定義:
queue ::queue (const queue &p){} };
main() { queue }
總結(jié):構(gòu)造函數(shù)的作用是對(duì)對(duì)象本身做初始化工作,也就是給用戶提供初始化類(lèi)中成員變量的一種方式。
如果一個(gè)類(lèi)中沒(méi)有定義任何的構(gòu)造函數(shù),那C++編輯器將在某些情況下提供一個(gè)默認(rèn)的構(gòu)造函數(shù)(不帶參數(shù)),3種情況:
1)、類(lèi)有虛擬成員函數(shù)或虛擬繼承父類(lèi)(虛擬基類(lèi));
2)、類(lèi)的基類(lèi)有構(gòu)造函數(shù);
3)、類(lèi)中的所有非靜態(tài)餓對(duì)象數(shù)據(jù)成員,它們所屬的類(lèi)中有構(gòu)造函數(shù)。
構(gòu)造函數(shù)的目的是為了初始化對(duì)象,因此一個(gè)構(gòu)造函數(shù)至少應(yīng)該
使得對(duì)象處于明確定義的狀態(tài)。
例://class string
string () {s=new char[80];len=80;}
string (int n) {s=new char[n];len=n;}
}
string::stringprintf() { cout<< s <<endl;}
定義對(duì)象:
string x,y(80);
x.print();
y.print();
此時(shí),x和y調(diào)用的print()函數(shù)結(jié)構(gòu)未定義,因?yàn)樵跇?gòu)造函數(shù)中只對(duì)字符數(shù)組分配了內(nèi)存,卻未對(duì)分配的內(nèi)存進(jìn)行初始化。
我們可以通過(guò)修改帶默認(rèn)參數(shù)值的構(gòu)造函數(shù)來(lái)改進(jìn):
string (int n=80) {s=new char[n];s[0]='\0';len=n;}
用默認(rèn)參數(shù)的形式來(lái)代替函數(shù)重載的形式。
注意點(diǎn):
1)構(gòu)造函數(shù)應(yīng)該使對(duì)象處于明確定義的狀態(tài);
2)保持物理狀態(tài)的一致性:對(duì)數(shù)據(jù)成員的定義保持一致,在所有函數(shù)中只能使用一種定義。
3)類(lèi)不變性:可以將不變性作為程序代碼的注釋?zhuān)?/len=strlen(s);
4)動(dòng)態(tài)內(nèi)存的一致性:接口一致性
void assign (char* str) { strcpy(s,str);}
void concat (string& a) {s=new char[len+1];strcpy(s,a.s);}
兩函數(shù)的表現(xiàn)行為存在不一致性:前者內(nèi)存不再分配,而后者一直在分配。我們應(yīng)只使用一種以保持一致性。
5)內(nèi)存泄露:concat函數(shù)中每拷貝一次,s就重新分配一次,s被新的指針值覆蓋,而前一指針值被拋棄,產(chǎn)生內(nèi)存垃圾。
因此concat函數(shù)必須保證舊的數(shù)組一定要被刪除,對(duì)于每一個(gè)new,就必須有一個(gè)delete操作,且delete語(yǔ)句只能被增加在
新的字符串創(chuàng)建之后。
void concat (string& a) {new_s=new char[len+1];strcpy(s,a.s); delete[]s;s=new_s;}