構造器

在類別基礎的面向物件程式設計中，構造器是一個類別;}-，或者一些諸如物件池的分配方案來完成這一過程的子程式。種類.引數化構造器.接收引數的構造器被稱為引數化構造器。引數的數量可以大於或等於一。例如，在C++中：class Exampleint x, y;public:Example();Example(int a, int b); // Parameterized constructorExample :: Example()Example :: Example(int a, int b)x = a;y = b;使用引數化構造器宣告物件時，必須傳入初始值作為構造器的引數。在這種情況下，一般的宣告物件的方法可能不再適用。構造器函式的呼叫方式可以分為顯式和隱式兩種。Example e = Example(0, 50); // Explicit callExample e(0, 50); // Implicit call預設構造器.如果在編寫一個可例項化的類時沒有專門編寫構造器，多數程式語言會自動生成預設構造器。預設構造器的特性依不同語言而定。某些情況下它會將所有的例項變數同時初始化到0，或者任何其他別的值；某些預設構造器什麼也不會做。某些語言 (Java, C#, VB .NET) 會預設構造由該類型別定義的陣列，使其充滿空值引用。沒有空值引用的語言一般會禁止預設構造包含不可預設構造物件的陣列，或者要求在建立時專門初始化這些數值 (C++):class student{public:int a,b;student(a=0,b=0) //default constructorint main() {轉換建構子.轉換建構子可定義從使用者定義或內建型別轉換成使用者定義型別的作業。複製建構子.複製建構子。建構子也可以有更多的引數，但除了最左第一個引數是該類別的參照類別型外，其它引數必須有預設值。移動建構子.移動建構函式是 C++11 中新增的一種建構函式，用來避免多餘的分配新記憶體——複製——銷燬舊記憶體的操作。C++11 條目內的介紹。記憶體機制.在 Java, C# 和 VB .NET 裡，構造器會在一種叫做堆積的特殊資料結構裡建立作為引用型別的例項。數值型別則會建立在叫做堆疊的有序資料結構中。VB .NET and C# 會允許用codice_17來建立值型別的例項。然而在這些語言中，即使使用這種方法建立的物件依然只會在棧上。在 C++ 中，不用 new 建立的物件會儲存在棧上，使用 new 建立時則會在堆積上。它們必須分別使用解構函式或者 delete 操作才能被刪除。語言細節.Java.在Java裡，構造器和其他方法的主要差別在於：Java 裡的構造器會按照以下順序完成下列工作：在 Java 中可以透過關鍵詞 codice_22 訪問父類的構造器。public class Example// Definition of the constructor.public Example()this(1);// Overloading a constructorpublic Example(int input)data = input; // This is an assignment// Declaration of instance variable(s).private int data;// Code somewhere else// Instantiating an object with the above constructorExample e = new Example(42);不接收任何引數的構造器被稱作“無引數構造器”。Visual Basic .NET.在Visual Basic .NET中, 建構子以"codice_3"為定義方法，並且必須是個 Sub。Class FoobarPrivate strData As String' ConstructorPublic Sub New(ByVal someParam As String)strData = someParamEnd SubEnd Class' code somewhere else' instantiating an object with the above constructorDim foo As New Foobar(".NET")C#.public class MyClassprivate int a;private string b;// Constructorpublic MyClass() : this(42, "string")// Overloading a constructorpublic MyClass(int a, string b)this.a = a;this.b = b;// Code somewhere// Instantiating an object with the constructor aboveMyClass c = new MyClass(42, "string");C# 靜態建構子.在C#中,"靜態建構子"是用來初始化任何靜態資料。靜態建構函式也稱為“類建構函式”，由於類建構函式在生成的 MSIL 里名為“.cctor”，因此也被稱為“cctor”。靜態建構函式允許複雜的靜態變數初始化。靜態建構函式在該類第一次被訪問時呼叫，任何使用該類的操作都會引發靜態建構函式的執行。靜態建構函式是執行緒安全的，並且是單例的。當用在泛型類中時，靜態建構函式對於泛型的每個例項化都呼叫一次。靜態變數也同樣如此。public class MyClassprivate static int _A;// Normal constructorstatic MyClass()_A = 32;// Standard default constructorpublic MyClass()// Code somewhere// Instantiating an object with the constructor above// right before the instantiation// The variable static constructor is executed and _A is 32MyClass c = new MyClass();C++.C++ 的建構函式以該回傳值型別也無法-{zh-cn:返回值;zh-tw:回傳數值}-：class C{public:C(void){建構函式的函式體執行是在各個成員構造完之後才開始，因此要想更改成員的-{zh-tw:建構;zh-cn:構造-{zh-cn:方式;zh-tw:方法}-需要使用成員初始化列表：class B{public:std::string str;B(const char *psz): str(psz){基類的方式與成員相同，是在初始化列表中寫基類名、接建構函式引數表：class D: public B{public:D(void): B("Hello, world!"){複製建構函式接受同類物件的左值引用：class E{public:E(const E &amp;e){...}//Copy constructorE(E &amp;&amp;e){...}//Move constructorC++ 中，程式設計師若未對某類定義建構函式，編譯器在滿足條件時會定義相應的函式，等頁面。CFML.component initmethod="Cheese" {// propertiesproperty name="cheeseName";// constructorfunction Cheese Cheese( required string cheeseName ) {variables.cheeseName = arguments.cheeseName;return this;Object Pascal.program OopProgram;typeTPerson = classprivateFName: string;publicproperty Name: string read FName;constructor Create(AName: string);end;constructor TPerson.Create(AName: string);beginFName := AName;end;varPerson: TPerson;beginPerson := TPerson.Create('Peter'); // allocates an instance of TPerson and then calls TPerson.Create with the parameter AName = 'Peter'end.Perl.package Person;sub new {# Class name is implicitly passed in as 0th argument.my $class = shift;# Default attribute values, if you have any.my %defaults = ( foo =&gt; "bar" );# Initialize attributes as a combination of default values and arguments passed.my $self = { %defaults, @_ };# Check for required arguments, class invariant, etc.if ( not defined $self-&gt;{first_name} ) {die "Mandatory attribute missing in Person-&gt;new(): first_name";if ( not defined $self-&gt;{last_name} ) {die "Mandatory attribute missing in Person-&gt;new(): last_name";if ( defined $self-&gt;{age} and $self-&gt;{age}  #