構(gòu)造函數(shù)

構(gòu)造函數(shù) ,是一種特殊的方法。主要用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創(chuàng)建對象的語句中。特別的一個類可以有多個構(gòu)造函數(shù) ,可根據(jù)其參數(shù)個數(shù)的不同或參數(shù)類型的不同來區(qū)分它們 即構(gòu)造函數(shù)的重載。

構(gòu)造函數(shù)基本信息

中文名 構(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í)行任何操作。

例子

#include
 
  
usingnamespacestd;
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)造器會按照以下順序完成下列工作:

  1. 將類變量初始到缺省值。(byte, short, int, long, float, 和 double 變量會默認設為它們相應的0值,booleans 會被設為 false, chars 會被設為空字符('