中文名 | 構(gòu)造函數(shù) | 外文名 | constructor |
---|---|---|---|
作????用 | 為對象成員變量賦初始值 | 語????句 | new運算符一起使用 |
C 構(gòu)造函數(shù)
C 語言為類提供的構(gòu)造函數(shù)可自動完成對象的初始化任務,全局對象和靜態(tài)對象的構(gòu)造函數(shù)在main()函數(shù)執(zhí)行之前就被調(diào)用,局部靜態(tài)對象的構(gòu)造函數(shù)是當程序第一次執(zhí)行到相應語句時才被調(diào)用。然而給出一個外部對象的引用性聲明時,并不調(diào)用相應的構(gòu)造函數(shù),因為這個外部對象只是引用在其他地方聲明的對象,并沒有真正地創(chuàng)建一個對象。
C 的構(gòu)造函數(shù)定義格式為:
class <類名>
{
public:
<類名>(參數(shù)表);
//...(還可以聲明其它成員函數(shù))
};
<類名>::<函數(shù)名>(參數(shù)表)
{
//函數(shù)體
}
如以下定義是合法的:
class T
{
public:
T(int a=0){ i=a; }//構(gòu)造函數(shù)允許直接寫在類定義內(nèi),也允許有參數(shù)表。
private:
int i;
};
如果一個類中沒有定義任何的構(gòu)造函數(shù),那么編譯器只有在以下三種情況,才會提供默認的構(gòu)造函數(shù):
1、如果類有虛擬成員函數(shù)或者虛擬繼承父類(即有虛擬基類)時;
2、如果類的基類有構(gòu)造函數(shù)(可以是用戶定義的構(gòu)造函數(shù),或編譯器提供的默認構(gòu)造函數(shù));
3、在類中的所有非靜態(tài)的對象數(shù)據(jù)成員,它們對應的類中有構(gòu)造函數(shù)(可以是用戶定義的構(gòu)造函數(shù),或編譯器提供的默認構(gòu)造函數(shù))。
<類名>::<類名>(){},即不執(zhí)行任何操作。
例子
#includeusingnamespacestd; classtime { public: time()//constructor.構(gòu)造函數(shù) { hour=0; minute=0; sec=0; } voidset_time(); voidshow_time(); private: inthour,minute,sec; }; intmain() { classtimet1; t1.show_time(); t1.set_time(); t1.show_time(); return0; } voidtime::set_time() { cin>>hour>>minute>>sec; } voidtime::show_time() { cout< 程序運行情況:
0:0:0
10 11 11 回車
10:11:11
任何時候,只要創(chuàng)建類或結(jié)構(gòu),就會調(diào)用它的構(gòu)造函數(shù)。類或結(jié)構(gòu)可能有多個接受不同參數(shù)的構(gòu)造函數(shù)。構(gòu)造函數(shù)使得程序員可設置默認值、限制實例化以及編寫靈活且便于閱讀的代碼。
PHP的構(gòu)造函數(shù)
void __construct( [mixed args [, ...]] )
php 5 允行開發(fā)者在一個類中定義一個方法作為構(gòu)造函數(shù)。具有構(gòu)造函數(shù)的類會在每次創(chuàng)建對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。
注:如果子類中定義了構(gòu)造函數(shù)則不會暗中調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。
例子 使用新標準的構(gòu)造函數(shù)
<"InBaseClassconstructor/n";}} classSubClassextendsBaseClass{ function__construct(){ parent::__construct();print"InSubClassconstructor/n";}} $obj=newBaseClass();$obj=newSubClass(); "para" label-module="para">為了實現(xiàn)向后兼容性,如果 php 5 在類中找不到__construct()函數(shù),它就會嘗試尋找舊式的構(gòu)造函數(shù),也就是和類同名的函數(shù)。因此唯一會產(chǎn)生兼容性問題的情況是:類中已有一個名為__construct()的方法,但它卻又不是構(gòu)造函數(shù)。
Python的構(gòu)造函數(shù)
定義格式為
class <類名>:
__init__(self [,參數(shù)表]):
#函數(shù)體
#其它的方法和屬性
構(gòu)造函數(shù)其他特點
1.它的函數(shù)名與類名相同;
2.它可以重載;
3.不能指定返回類型,即使是void也不行;
4.雖然在一般情況下,構(gòu)造函數(shù)不被顯式調(diào)用,而是在創(chuàng)建對象時自動被調(diào)用。但是并不是不能被顯式調(diào)用。有些時候是一定要顯式調(diào)用的,只要是父類有帶參的構(gòu)造函數(shù),在子類中就必須顯式的調(diào)用父類的構(gòu)造函數(shù),因為子類的構(gòu)造器在實例化時無法找到父類的構(gòu)造函數(shù)(當父類有自己寫的無參構(gòu)造函數(shù)時,子類也不用顯式調(diào)用)。
void__destruct( void )
php 5 引入了析構(gòu)函數(shù)的概念,這類似于其它面向?qū)ο蟮恼Z言,如 C 。析構(gòu)函數(shù)會在到某個對象的所有引。
構(gòu)造函數(shù)語法
Java, C , C#, ActionScript和PHP 4中的命名規(guī)范會要求構(gòu)造器函數(shù)的名稱與它所在類的名稱相同。
PHP 5 建議的構(gòu)造器函數(shù)名稱為__construct。為了保證向下兼容,__construct方法無法找到時會調(diào)用任何跟類名同名的方法作為構(gòu)造器。從 PHP 5.3.3 起,這種途徑只對非名字空間的類有效。
在Perl里,構(gòu)造器被約定俗成地命名為"new",并且會完成創(chuàng)建對象的大量工作。
在 Perl 的 Moose 對象系統(tǒng)中,構(gòu)造函數(shù)(叫做 new)是自動生成的,程序員可以通過指定一個 BUILD 方法來對其進行擴充。
在 Visual Basic .NET里,構(gòu)造器被命名為New,是個 Sub。
Python里構(gòu)造器的被分為 __new__ 和 __init__ 兩個方法。__new__方法負責為實例分配內(nèi)儲存空間,并接受自身的類作為參數(shù)(一般命名為 cls)。__init__方法接受被新建的實例作為參數(shù)(一般稱為 self)。
Object Pascal 的構(gòu)造函數(shù)用關(guān)鍵字 constructor 標識,并且可以起任意名字(但一般來說會被起名為 Create)。
Objective-C 的構(gòu)造函數(shù)分成兩個方法,alloc 和 init。alloc 方法分配內(nèi)存,init 負責初始化。new 方法會調(diào)用 alloc 和 init 兩者。
構(gòu)造函數(shù)內(nèi)存機制
在 Java, C# 和 VB .NET 里,構(gòu)造器會在一種叫做堆的特殊數(shù)據(jù)結(jié)構(gòu)里創(chuàng)建作為引用類型的實例。值類型(例如 int, double 等等)則會創(chuàng)建在叫做棧的有序數(shù)據(jù)結(jié)構(gòu)里。VB .NET and C# 會允許用new來創(chuàng)建值類型的實例。然而在這些語言里,即使使用這種方法創(chuàng)建的對象依然只會在棧里。
在 C 里,不用 new 創(chuàng)建的對象會保存在棧里,使用 new 創(chuàng)建時則會在堆里。它們必須分別使用析構(gòu)函數(shù)或者delete操作才能被刪除。
構(gòu)造函數(shù)語言細節(jié)
構(gòu)造函數(shù)Java
在Java里,構(gòu)造器和其他方法的主要差別在于:
構(gòu)造器不具有任何顯性返回類型。
構(gòu)造器無法被直接“new” invokes them).
構(gòu)造器無法被標示為synchronized, final, abstract, native, 或者static。
Java 里的構(gòu)造器會按照以下順序完成下列工作:
將類變量初始到缺省值。(byte, short, int, long, float, 和 double 變量會默認設為它們相應的0值,booleans 會被設為 false, chars 會被設為空字符('