1.構(gòu)造函數(shù)
構(gòu)造函數(shù)(constructor)是類的一個(gè)特殊的成員函數(shù),它與類名同名。當(dāng)定義該類的對(duì)象時(shí),構(gòu)造函數(shù)將被系統(tǒng)自動(dòng)調(diào)用用以實(shí)現(xiàn)對(duì)該對(duì)象的初始化。
構(gòu)造函數(shù)不能有返回值,因而不能指定包括void在內(nèi)的任何返回值類型。
構(gòu)造函數(shù)的定義與其他成員函數(shù)的定義一樣可以放在類內(nèi)或類外。
構(gòu)造函數(shù)的定義格式為
類名(形參說(shuō)明)
{函數(shù)體}
構(gòu)造函數(shù)既可以定義成有參函數(shù),也可以定義成無(wú)參函數(shù),要根據(jù)問(wèn)題的需要來(lái)定。
注意:程序中不能直接調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)是在創(chuàng)建對(duì)象時(shí)由系統(tǒng)直接調(diào)用的,因此,在構(gòu)造函數(shù)中一般完成初始化類成員變量的操作。
2.構(gòu)造函數(shù)的重載
一個(gè)類中出現(xiàn)了兩個(gè)以上的同名的成員函數(shù)時(shí),稱為類的成員函數(shù)的重載。
在類的成員函數(shù)的重載中,比較常見(jiàn)形式是構(gòu)造函數(shù)的重載,當(dāng)類中出現(xiàn)了重載構(gòu)造函數(shù)時(shí),C++語(yǔ)言將根據(jù)構(gòu)造函數(shù)中的參數(shù)個(gè)數(shù)和類型選擇合適的構(gòu)造函數(shù)來(lái)完成對(duì)象的構(gòu)造。
3.默認(rèn)構(gòu)造函數(shù)與缺省參數(shù)的構(gòu)造函數(shù)
如果在類中沒(méi)有顯示定義構(gòu)造函數(shù),則編譯系統(tǒng)會(huì)為該類提供一個(gè)默認(rèn)的構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是一個(gè)無(wú)參函數(shù),函數(shù)體為空,它僅僅負(fù)責(zé)創(chuàng)建對(duì)象,而不做任何初始化工作(即不給相應(yīng)的數(shù)據(jù)成員賦初值),所以在該類的對(duì)象創(chuàng)建時(shí)不能保證有一個(gè)確定的初始狀態(tài)。
良好的編程習(xí)慣應(yīng)該是給類提供合適的完成初始化工作的構(gòu)造函數(shù)。
但是,只要一個(gè)類定義了一個(gè)構(gòu)造函數(shù)(不一定是無(wú)參構(gòu)造函數(shù)),編譯系統(tǒng)就不再提供默認(rèn)的構(gòu)造函數(shù)。
當(dāng)構(gòu)造函數(shù)具有缺省參數(shù)時(shí),稱為具有缺省參數(shù)的構(gòu)造函數(shù),在使用具有缺省參數(shù)的構(gòu)造函數(shù)時(shí),要防止二義性。
4.拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)。定義拷貝構(gòu)造函數(shù)的一般格式為
類名::類名(const 類名 &形式參數(shù))
{ 函數(shù)體 }
拷貝構(gòu)造函數(shù)的函數(shù)名與類名同名。該函數(shù)也沒(méi)有返回值。
拷貝構(gòu)造函數(shù)的功能是通過(guò)將一個(gè)同類對(duì)象的值拷貝給一個(gè)新對(duì)象,來(lái)完成對(duì)新對(duì)象的初始化,即用一個(gè)對(duì)象去構(gòu)造另外一個(gè)對(duì)象。
如果在類的定義中沒(méi)有定義拷貝構(gòu)造函數(shù),則編譯系統(tǒng)將自動(dòng)生成一個(gè)具有上述形式的默認(rèn)的拷貝構(gòu)造函數(shù),作為該類的公有成員。
5.析構(gòu)函數(shù)
與構(gòu)造函數(shù)對(duì)應(yīng)的是析構(gòu)函數(shù)。當(dāng)一個(gè)對(duì)象被定義時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)為該對(duì)象分配相應(yīng)的資源,當(dāng)對(duì)象使用完畢后且在對(duì)象消失前,系統(tǒng)會(huì)自動(dòng)調(diào)用類的析構(gòu)函數(shù)來(lái)釋放這些系統(tǒng)資源。
析構(gòu)函數(shù)也是類的一個(gè)特殊的成員函數(shù),其函數(shù)名稱是在類名的前面加上“~”;它沒(méi)有返回值,也沒(méi)有參數(shù)。一個(gè)類中只能擁有一個(gè)析構(gòu)函數(shù),所以析構(gòu)函數(shù)不能重載。
析構(gòu)函數(shù)的定義方式為
~類名()
{ 函數(shù)體 }
如果程序員在定義類時(shí)沒(méi)有為類提供析構(gòu)函數(shù),則系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的析構(gòu)函數(shù),其形式為
~類名()
{ }
對(duì)象被析構(gòu)的順序與其創(chuàng)建時(shí)的順序正好相反,即最后構(gòu)造的對(duì)象最先被析構(gòu)。
如果一個(gè)對(duì)象是被new運(yùn)算符動(dòng)態(tài)創(chuàng)建的,當(dāng)使用delete運(yùn)算符釋放它時(shí),delete將會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。
6.一個(gè)類的對(duì)象作為另一個(gè)類的數(shù)據(jù)成員
當(dāng)一個(gè)類中的數(shù)據(jù)成員是某一個(gè)類的對(duì)象時(shí),可稱這種成員是新建類的子對(duì)象或?qū)ο蟪蓡T,則新類的定義格式可表示為
calss X
{
類名1 成員名1;
類名2 成員名2;
類名3 成員名3;
……………
類名n 成員名n;
…。………… //其他成員
};
其中,X為新建類的類名,類名1、類名2、……、類名n必須是已定義過(guò)的類。如
class A {};
class B
{
A a;
};
則在創(chuàng)建類B的對(duì)象(調(diào)用類B的構(gòu)造函數(shù))時(shí),會(huì)自動(dòng)調(diào)用類A的構(gòu)造函數(shù)。如果類A的構(gòu)造函數(shù)為有參函數(shù)時(shí),通常采用初始化表的方式來(lái)調(diào)用構(gòu)造函數(shù)。
新類的構(gòu)造函數(shù)的一般定義格式為
新類(參數(shù)表0):成員1(參數(shù)表1),成員2(參數(shù)表2),…,成員n(參數(shù)表n)
{ ………… }
其中,成員1、成員2、……、成員n是新類中的對(duì)象成員;參數(shù)表1提供初始化成員1所需的參數(shù),參數(shù)表2提供初始化成員2所需的參數(shù),依此類推,并且這幾個(gè)參數(shù)表中的參數(shù)均來(lái)自參數(shù)表0.另外,初始化新類的非對(duì)象成員所需的參數(shù),也由參數(shù)表0提供。
7.常對(duì)象與常對(duì)象成員
(1)常對(duì)象
常對(duì)象是指對(duì)象常量,其定義格式為
const 類名 對(duì)象名;
從格式中可以看出,常對(duì)象的定義與一般對(duì)象的定義相比,在類名前必須加const關(guān)鍵字。
常對(duì)象具有以下特點(diǎn)
l 常對(duì)象在定義時(shí)必須進(jìn)行初始化,而且在程序中不能再對(duì)其進(jìn)行更新。
l 通過(guò)常對(duì)象只能調(diào)用類中的常成員函數(shù),而不能調(diào)用類中的其他成員函數(shù)。
(2)常對(duì)象成員
常對(duì)象成員分為常成員函數(shù)和常數(shù)據(jù)成員。
1)常成員函數(shù)
在類中,使用關(guān)鍵字const說(shuō)明的成員函數(shù)成為常成員函數(shù),常成員函數(shù)的說(shuō)明格式為
類型 函數(shù)名(形參表) const;
類中的常成員函數(shù)與普通成員函數(shù)相比,具有以下特點(diǎn)
l 常成員函數(shù)為類的只讀函數(shù),這種成員函數(shù)可以讀取數(shù)據(jù)成員的值,但不可以更新數(shù)據(jù)成員的值,它也不能調(diào)用該類中沒(méi)有const修飾的其他成員函數(shù)。
l 常成員函數(shù)定義中的const關(guān)鍵字是函數(shù)類型的一部分,因此在其實(shí)現(xiàn)部分中也要帶上const關(guān)鍵字。
l 常成員函數(shù)定義中的const關(guān)鍵字可以參與區(qū)分重載函數(shù)。
例如:
#include <iostream.h> class Test_const{ void Test_const::setvalue(int newvalue) void main() |
2)常數(shù)據(jù)成員
類中定義的數(shù)據(jù)成員,除了可以為一般變量外,還可以為const常量,這種數(shù)據(jù)成員稱為常數(shù)據(jù)成員。
構(gòu)造函數(shù)可以對(duì)對(duì)象的數(shù)據(jù)成員進(jìn)行初始化,但如果數(shù)據(jù)成員為常量成員或引用成員時(shí),則不能在構(gòu)造函數(shù)中直接用賦值語(yǔ)句為其進(jìn)行賦值。需要利用構(gòu)造函數(shù)所附帶的初始化表進(jìn)行初始化,即在構(gòu)造函數(shù)的括號(hào)后面加上“:”和初始化表,其格式為
類名::類名(形參表):常數(shù)據(jù)成員名1(值1),常數(shù)據(jù)成員名2(值2),……
{
//構(gòu)造函數(shù)的函數(shù)體
}
可以看出,當(dāng)有多個(gè)數(shù)據(jù)成員時(shí),初始化表中的初始化項(xiàng)有多個(gè),且需要用逗號(hào)隔開(kāi)。
8.類作用域
類作用域又可稱為類域,它是指在類定義中用一對(duì)大括號(hào)開(kāi)括起來(lái)的范圍。
不同的類的成員函數(shù)可以具有相同的名字,因此,需要用作用域運(yùn)算符“::”來(lái)指明該成員函數(shù)所屬的類。
在類的成員函數(shù)中可以直接引用類的數(shù)據(jù)成員。但是,如果在成員函數(shù)中定義了同名的局部變量時(shí),則必須用作用域運(yùn)算符“::”來(lái)指定,以免混亂。例如:
#include <iostream.h> class Region{ private: int x; int y; public: Region(int x,int y) { Region::x=x; Region::y=y; } void print() { cout<<"x="<<x<<",y="<<y<<endl; } }; void main() { Region region(5,10); Region *p; p=®ion; region.print(); p->print(); } |
聯(lián)系客服