コンストラクター(オブジェクト指向プログラミング)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

クラスベースの オブジェクト指向プログラミングではコンストラクター(省略形:ctor )は、オブジェクトを作成するために呼び出される特殊なタイプのサブルーチンです。新しいオブジェクトを使用できるように準備し、コンストラクターが必要なメンバー変数を設定するために使用する引数を受け入れることがよくあります。

コンストラクターはインスタンスメソッドに似ていますが、明示的な戻り型がなく、暗黙的に継承されず、通常はスコープ修飾子のルールが異なるという点でメソッドとは異なります。多くの場合、コンストラクターは宣言クラスと同じ名前になります。それらには、オブジェクトのデータメンバーを初期化し、クラスの不変条件を確立するタスクがあり、不変条件が無効な場合は失敗します。適切に記述されたコンストラクターは、結果のオブジェクト有効な状態のままにします。不変オブジェクトはコンストラクターで初期化する必要があります。

ほとんどの言語では、パラメーターが異なるクラスに複数のコンストラクターが存在する可能性があるため、コンストラクターのオーバーロードが許可されています。一部の言語では、特殊なタイプのコンストラクターが考慮されています。具体的には単一のクラスを使用してオブジェクトを作成し、クラスの新しいインスタンスを返すコンストラクターは、オブジェクトを作成するファクトリによって抽象化されますが、複数のクラスまたはオブジェクトプールなどのさまざまな割り当てスキームを使用してさまざまな方法で作成できます

タイプ

パラメータ化されたコンストラクタ

少なくとも1つの引数を取ることができるコンストラクターは、パラメーター化されたコンストラクターと呼ばれます。パラメータ化されたコンストラクタでオブジェクトを宣言する場合、初期値を引数としてコンストラクタ関数に渡す必要があります。オブジェクト宣言の通常の方法は機能しない可能性があります。コンストラクターは、明示的または暗黙的に呼び出すことができます。コンストラクターを暗黙的に呼び出すメソッドは、省略形メソッドとも呼ばれます。

クラス { 
 パブリック
  ();
  int a int b ); //パラメータ化されたコンストラクタ。     

 プライベート
  int x_ ; 
  int y_ ; 
};

::()=デフォルト;  

::int x int y x_ x )、y_ y {}       
e =0、50 ; _ //明示的な呼び出し。e2 0、50 ; _ //暗黙の呼び出し。      
    

デフォルトのコンストラクター

プログラマーがインスタンス化可能なクラスのコンストラクターを提供しない場合、Javaコンパイラーはデフォルトのコンストラクターを挿入しますあなたに代わってあなたのコードに。このコンストラクターは、デフォルトコンストラクターと呼ばれます。コンパイル中にコードに挿入され、.classファイルに存在するため、ソースコード(Javaファイル)にはありません。デフォルトのコンストラクターの動作は言語に依存します。データメンバーをゼロまたは他の同じ値に初期化するか、まったく何もしない場合があります。Javaでは、「デフォルトコンストラクター」とは、クラスにコンストラクターが定義されていない場合、またはプログラマー定義のコンストラクターがない場合にコンパイラーによって自動的に生成されるnullaryコンストラクターを指します(たとえば、Javaでは、デフォルトコンストラクターは暗黙的にスーパークラスのnullaryコンストラクターは、空の本体を実行します)。すべてのフィールドは、初期値0(整数型)、0.0(浮動小数点型)、false(ブール型)、

#include <iostream> 

クラス 学生{ 
 パブリック
  Student int a = 0 int b = 0 ); //デフォルトのコンストラクタ。         

  int a ; 
  int b ; 
};

コンストラクターのコピー

C ++と同様に、Javaも「コピーコンストラクタ」をサポートしています。ただし、C ++とは異なり、独自に作成しない場合、Javaはデフォルトのコピーコンストラクターを作成しません。コピーコンストラクターは、クラスオブジェクトをコピーするときにコンパイラーによって実行されるアクションを定義します。Copyコンストラクターには、クラスの型である1つの仮パラメーターがあります(パラメーターはオブジェクトへの参照である可能性があります)。同じクラスの既存のオブジェクトのコピーを作成するために使用されます。両方のクラスが同じであっても、変換コンストラクターとしてカウントされます。コピーコンストラクターは通常、copy ctorまたはcctorと省略されますが、同じ省​​略形を使用する.NETで使用されるクラスコンストラクターとは何の関係もありません。

変換コンストラクター

変換コンストラクターは、コンパイラーが、異なるタイプのオブジェクトに基づいて、あるクラスに属するオブジェクトを暗黙的に作成するための手段を提供します。これらのコンストラクターは通常、引数またはオペランドを適切な型に変換するために暗黙的に呼び出されますが、明示的に呼び出されることもあります。

コンストラクターの移動

C ++では、moveコンストラクターはクラスのオブジェクトへの値参照を取り、パラメーターオブジェクトのリソースの所有権の転送を実装するために使用されます。

構文

  • JavaC ++C#ActionScriptPHP 4、およびMATLABには、コンストラクターが関連付けられているクラスと同じ名前を持つ命名規則があります。
  • PHP 5では、コンストラクターの推奨名はです__construct__construct下位互換性のために、メソッドが見つからない場合は、クラスと同じ名前のメソッドが呼び出されます。PHP 5.3.3以降、これは名前空間のないクラスに対してのみ機能します。[1]
  • PHP 7では、コンストラクターに常に。という名前を付ける必要があります__constructクラスと同じ名前のメソッドは、E_DEPRECATEDレベルのエラーをトリガーします。[1]
  • Perlでは、コンストラクターは慣例により「new」という名前であり、かなりの量のオブジェクトを作成する必要があります。
  • Perl用のMooseオブジェクトシステムでは、コンストラクター( newという名前)が自動的に作成され、BUILDメソッドを指定することで拡張されます。
  • Visual Basic .NETでは、コンストラクタは「New」と呼ばれます。
  • Pythonでは、コンストラクターは「 __new__」と「」の2つのメソッドに分割され__init__ます。この__new__メソッドは、インスタンスにメモリを割り当てる役割を果たし、引数としてクラスを受け取ります(通常は「cls」と呼ばれます)。メソッド( 「__init__イニシャライザー」と呼ばれることもあります)には、新しく作成されたインスタンスが引数として渡されます(通常は「self」と呼ばれます)。[2]
  • Object Pascalコンストラクターは、キーワード " constructor"で示され、ユーザー定義の名前を付けることができます(ただし、ほとんどの場合 " Create"と呼ばれます)。
  • Objective-Cでは、コンストラクターメソッドは「 alloc」と「」init2つのメソッドに分割され、allocメソッドはクラスのインスタンスのメモリを確保(割り当て)し、initメソッドはインスタンスの初期化の大部分を処理します。メソッド" "を呼び出すと、クラスインスタンスのメソッドとメソッドnewの両方が呼び出されます。allocinit

メモリ編成

Java、C#、およびVB .NETでは、コンストラクターは「ヒープ」と呼ばれる特別なメモリ構造に参照型オブジェクトを作成します。値型(int、doubleなど)は、「スタック」と呼ばれる順次構造で作成されます。VB .NETおよびC#では、new演算子を使用して値型オブジェクトを作成することもできますが、これらの値型オブジェクトは、演算子が使用されているかどうかに関係なく、スタック上に作成されます。

C ++では、オブジェクトは、コンストラクターがnew演算子なしで呼び出されたときにスタック上に作成され、コンストラクターがnew演算子付きで呼び出されたときにヒープ上に作成されます。スタックオブジェクトはスコープ外になると暗黙的に削除されますが、ヒープオブジェクトはデストラクタによって暗黙的に削除されるか、delete演算子を使用して明示的に削除される必要があります。

言語の詳細

C++

C ++ではコンストラクターの名前はクラスの名前です。何も返しません。他のメンバー関数と同じようにパラメーターを持つことができますコンストラクター関数は通常、パブリックセクションで宣言されますが、ユーザーがそれらへのアクセスを制限したい場合は、保護セクションとプライベートセクションで宣言することもできます。

コンストラクターには2つの部分があります。1つ目は、パラメーターリストに続き、メソッド本体の前にある初期化子リストです。コロンで始まり、エントリはコンマで区切られます。初期化子リストは必須ではありませんが、データメンバーに値を提供し、個別の割り当てステートメントを回避する機会を提供します。constまたは参照型のデータメンバー、またはパラメーターなしのコンストラクターロジックを持たないメンバーがある場合は、初期化子リストが必要です。割り当ては、データメンバーが宣言された順序に従って行われます(初期化子リストの順序が異なっていても)。[3] 2番目の部分は本体です。これは、中括弧で囲まれた通常の方法の本体です。

C ++では、複数のコンストラクターを使用できます。他のコンストラクターは異なるパラメーターを持っている必要があります。さらに、デフォルト値が指定されているパラメーターを含むコンストラクターは、すべてのパラメーターにデフォルト値が指定されているわけではないという制限に準拠する必要があります。これは、デフォルトのコンストラクターがある場合にのみ問題となる状況です。基本クラス(または基本クラス)のコンストラクターは、派生クラスから呼び出すこともできます。コンストラクター関数は継承されず、それらのアドレスを参照することはできません。メモリ割り当てが必要な場合、new演算子とdelete演算子が暗黙的に呼び出されます。

コピーコンストラクターには、 const参照として渡される同じタイプのパラメーターがあります(例: Vector(const Vector&rhs))明示的に指定されていない場合、コンパイラーは各メンバー変数にコピーコンストラクターを使用するか、プリミティブ型の場合は単に値をコピーします。クラスに動的にメンバー(または他のリソースへのハンドル)が割り当てられている場合、デフォルトの実装は効率的ではありません。これは、破棄時に削除の二重呼び出し(またはリソースの二重解放)が発生する可能性があるためです。

クラス Foobar { 
 パブリック
  Foobar double r = 1.0    
         double alpha = 0.0 //コンストラクター、デフォルト値のパラメーター。x_ r * cos alpha ))//<-初期化子リスト{     
             
  
    y_ = r * sin alpha ); //<-通常の割り当て}      
  

 プライベート
  ダブルx_ ; 
  ダブルy_ ; 
};

呼び出しの例:

Foobar a  
       b 3 )、
       c 5 M_PI / 4 ); 

関数からオブジェクトを返すとき、またはオブジェクトを値で渡すとき、戻り値の最適化が適用されない限り、オブジェクトコピーコンストラクターが暗黙的に呼び出されます。

C ++は、デフォルトのコピーコンストラクターを暗黙的に生成します。これは、プログラマーがコピーコンストラクターを提供するか、コピーコンストラクターを明示的に削除する(クローン作成を防ぐため)か、基本クラスまたはメンバー変数の1つを削除しない限り、すべての基本クラスとすべてのメンバー変数のコピーコンストラクターを呼び出します。またはアクセスできない(プライベート)。カスタマイズされたコピーコンストラクター参照カウントポインターのディープコピーなど)を必要とするほとんどの場合、デストラクタコピー代入演算子もカスタマイズする必要があります。これは一般的に三つのルールと呼ばれます。

C#

C#コンストラクター の例:

public  class  MyClass 
{ 
    private  int  a ; 
    プライベート 文字列 b ;

    //コンストラクタ
    publicMyClass  this 42 "string" { }   
    
    

    //コンストラクタをオーバーロードし
    ます publicMyClass int  a  string  b 
    { 
        this a  =  a ; 
        これb  =  b ; 
    } 
}
//どこかにコードを記述します// 
MyClassの上のコンストラクターを使用してオブジェクトをインスタンス化します
c = new MyClass 42 "string" );     

C#静的コンストラクター

C#では静的コンストラクターは静的データ初期化子です。静的コンストラクターは、クラスコンストラクターとも呼ばれます。生成される実際のメソッドの名前は.cctorであるため、「cctors」とも呼ばれます。[4] [5]

静的コンストラクターを使用すると、複雑な静的変数の初期化が可能になります。[6] 静的コンストラクターは、クラスが最初にアクセスされたときに暗黙的に呼び出されます。クラスへの呼び出し(静的またはコンストラクター呼び出し)は、静的コンストラクターの実行をトリガーします。静的コンストラクターはスレッドセーフであり、シングルトンパターンを実装しますジェネリックプログラミングクラスで使用する場合、静的コンストラクターは、型ごとに1つずつ新しいジェネリックインスタンス化ごとに呼び出されます。静的変数もインスタンス化されます。

public  class  MyClass 
{ 
    private  static  int  _A ;

    //通常のコンストラクター
    staticMyClass  (){ _ A = 32 ; }
    
          
    

    //標準のデフォルトコンストラクタ
    publicMyClass  {
    

    } 
}
//どこかにコードを記述します//
上記のコンストラクターを使用してオブジェクトをインスタンス化します//
インスタンス化の直前
//変数staticコンストラクターが実行され、_Aは32です
MyClass  c  =  new  MyClass ();

CFML

CFMLinitは、コンストラクターメソッドとして ''という名前のメソッドを使用します。

Cheese.cfc

コンポーネント { 
   //プロパティ
   propertyname  = "cheeseName " ;

   //コンストラクター
   関数Cheeseinit  必須 文字cheeseName {変数cheeseName =引数チーズ名; これを返す; } }     
        
       
   

チーズのインスタンスを作成します。

myCheese  =  new  Cheese  'チェダー'  );

ColdFusion 10以降、[7] CFMLは、コンストラクターメソッドの名前の指定もサポートしています。

component  initmethod = "Cheese"  { 
   //プロパティ
   propertyname  = " cheeseName " ;

   //コンストラクター
   関数CheeseCheese  必須 文字cheeseName {変数cheeseName =引数チーズ名; これを返す; } }     
        
       
   

エッフェル

Eiffelでは、新しいオブジェクトを初期化するルーチンは作成プロシージャと呼ばれます。作成手順には次の特徴があります。

  • 作成プロシージャには、明示的な戻りタイプはありません(プロシージャの定義による)。[a]
  • 作成手順には名前が付けられています。
  • 作成手順は、クラスのテキストで作成手順として名前で指定されています。
  • 作成手順を明示的に呼び出して、既存のオブジェクトを再初期化できます。
  • すべての効果的な(つまり、具体的または非抽象的)クラスは、少なくとも1つの作成手順を指定する必要があります。
  • 作成プロシージャは、新しく初期化されたオブジェクトをクラス不変条件を満たす状態のままにする必要があります。[b]

オブジェクトの作成には微妙な点がいくつかありますが、[8]x: T作成命令で表現される典型的な宣言を使用した属性の作成create x.makeは、次の一連の手順で構成されます。

  • タイプの新しい直接インスタンスを作成しますT[c]
  • make新しく作成されたインスタンスに対して作成手順を実行します。
  • 新しく初期化されたオブジェクトをエンティティにアタッチしますx

以下の最初のスニペットでは、クラスPOINTが定義されています。プロシージャmakeは、キーワードの後に​​コーディングされfeatureます。

キーワードcreateは、インスタンスを初期化するために使用できるプロシージャのリストを紹介します。この場合、リストにはdefault_create、クラスから継承された空の実装を持つプロシージャANY、およびmakeクラス内にコード化されたプロシージャが含まれます。

クラス
    POINTcreatedefault_create 
make _ 
    _ 

特徴

    make  a_x_value  REAL ;  a_y_value  REAL 
        do 
            x  :=  a_x_value 
            y  :=  a_y_value 
        end

    x  REAL 
            -X座標

    y  REAL 
            --Y座標
        ..。

2番目のスニペットでは、クライアントであるクラスがPOINT宣言を持ちmy_point_1my_point_2タイプはPOINTです。

手続き型コードでmy_point_1は、原点(0.0、0.0)として作成されます。作成手順が指定されていないため、default_createクラスから継承された手順ANYが使用されます。この行はコーディングされている可能性がありますcreate my_point_1.default_createcreateキーワードを使用した命令では、作成プロシージャとして指定されたプロシージャのみを使用できます。次はの作成命令で、の座標のmy_point_2初期値を提供します。my_point_23番目の命令は、makeプロシージャを通常のインスタンス呼び出しして、アタッチされているインスタンスmy_point_2を異なる値で再初期化します。

    my_point_1  POINT 
    my_point_2  POINT 
        ..。

            create  my_point_1createmy_point_2 
            _  _ make 3.0、4.0 my_point_2 _ _ make 5.0、8.0 ..。_ _  
              
        

F#

F#では、コンストラクターにクラスで定義された任意のletまたはステートメントを含めることができます。ステートメントはプライベートフィールドを定義し、ステートメントはコードを実行します。キーワード を使用して、追加のコンストラクターを定義できます。doletdonew

type  MyClass (_ a   int  _ b   string  =  class 
    //プライマリコンストラクタleta 
    = _ a let  b = _ b do printfn " a =%i b =%s" a b  
       
        

    //追加のコンストラクター
    new (_ a   int  =  MyClass (_ a  ""  thenprintfn 
        "整数パラメーターが指定されました" 

    new (_ b   string  =  MyClass 0  _ b  thenprintfn 
        "文字列パラメータが指定されました" 

    new () =  MyClass 0  ""  thenprintfn 
        "パラメータが指定されていません"  end

//どこかにコードを
記述します//プライマリコンストラクタを使用してオブジェクトをインスタンス化します
letc1  = new MyClass 42 "string"     

//追加のコンストラクタを使用してオブジェクトをインスタンス化する
letc2= new MyClass(42)let c3 = new MyClass " string "  let c4 = MyClass // " new "キーワードはオプションです   
    
    

Java

Javaではコンストラクターは他のメソッドとは次の点で異なります。

  • コンストラクターが明示的な戻り型を持つことはありません。
  • コンストラクターを直接呼び出すことはできません(キーワード「new」がコンストラクターを呼び出します)。
  • コンストラクターには、アクセス以外の修飾子を付けないでください。

Javaコンストラクターは、次のタスクを次の順序で実行します。

  1. コンストラクターが定義されていない場合は、スーパークラスのデフォルトコンストラクターを呼び出します。
  2. メンバー変数を指定された値に初期化します。
  3. コンストラクターの本体を実行します。

this()Javaでは、ユーザーがキーワードを使用して別のコンストラクターで1つのコンストラクターを呼び出すことができます。しかしthis()、最初のステートメントでなければなりません。[9]

class  Example 
{  
    Example () //パラメーター化されていないコンストラクター
    { 
        this 1 );   //コンストラクター
        Systemの呼び出しアウトprintln "0-arg-cons" ); 
    }
    int  a  //パラメーター化されたコンストラクター
    { 
        System アウトprintln "1-arg-cons" ); 
    } 
} 
public  static  void  main String []  args 
{
   e  = 新しい (); 
}

Javaは、キーワード を介してスーパークラスのコンストラクターへのアクセスを提供します。super

public  classExample  { 
//コンストラクターの定義
    public Example (){ this 1 ); }
     
    
        
    

    //コンストラクターのオーバー
    ロードpublicExample  int input { data = input ; //これは割り当てです} 
    
           
    

    //インスタンス変数の宣言。
    プライベート int データ; 
}
//別の場所でコーディングします//上記のコンストラクターを
使用してオブジェクトをインスタンス化しますExamplee 
= new Example  42 ;   

引数の数がゼロのコンストラクターは、「引数なし」または「引数なし」のコンストラクターと呼ばれます。[10]

JavaScript

ES6の時点で、JavaScriptには他の多くのプログラミング言語と同様に直接コンストラクターがあります。それらはそのように書かれています

クラス FooBar  {
  コンストラクターbaz  { 
    this baz  =  baz 
  } 
}}

これは、そのようにインスタンス化できます

const  foo  =  new  FooBar '7' 

ES6以前のこれに相当するのは、オブジェクトをそのようにインスタンス化する関数を作成することでした。

function  FooBar  baz  { 
  this baz  =  baz ; 
}

これは、上記と同じ方法でインスタンス化されます。

ObjectPascal

Object Pascalでは、コンストラクターはファクトリメソッドに似ています。通常のメソッドとの唯一の構文上の違いは、名前の前にあるキーワードです(またはconstructorの代わりに)。任意の名前を付けることができますが、慣例では、のようにプレフィックスとして持つ必要があります。クラスのインスタンスの作成は、クラスの静的メソッドを呼び出すのと同じように機能しますprocedurefunctionCreateCreateWithFormattingTPerson.Create('Peter')

プログラム OopProgram ;

タイプ
  TPerson  =  class 
  private 
    FName  string ; 
  パブリック
    プロパティ Name  string  read  FName ; 
    コンストラクター Create AName  string ; 
  終了;

コンストラクター TPerson Create AName  string ; 
FNameを開始します
  := AName ; 終了;  


var 
  Person  TPerson ; 
Person := TPersonを開始します
  作成'ピーター' ; // TPersonのインスタンスを割り当ててから、パラメータAName='Peter'endを指定してTPerson.Createを呼び出します   

OCaml

OCamlには、コンストラクターが1つあります。パラメータは、クラス名の直後に定義されます。これらはインスタンス変数を初期化するために使用でき、クラス全体でアクセスできます。呼び出される匿名の隠しメソッドをinitializer使用すると、オブジェクトが作成された直後に式を評価できます。 [11]

クラス personfirst_namelast_name  = object val full_name = first_name  ^ " " ^ last_name _ 
  
           

    initializer 
      print_endline "こんにちは、私は"  ^  full_name  ^  "。" 

    メソッド get_last_name  =  last_name 
  end ;;

alonzo  = new person  "Alonzo" "Church" in (*こんにちは、私はAlonzo Churchです。*       

print_endline  alonzo get_last_name  (* Church *)

PHP

PHPバージョン5以降では、コンストラクターは(二重アンダースコアであることに注意してください)という名前のメソッド__construct()ありnew、オブジェクトの作成後にキーワードが自動的に呼び出します。通常、プロパティの初期化などの初期化を自動的に実行するために使用されます。コンストラクターは引数を受け入れることもできます。その場合、newステートメントを作成するときに、パラメーターのコンストラクター引数も送信する必要があります。[1]

クラス Person 
{
    プライベート 文字列 $name ;

    public  function  __construct string  $ name  void 
    { 
        $ this- > name  =  $ name ; 
    }

    public  function  getName () string 
    { 
        return  $ this- > name ; 
    } 
}

PHPでは、クラスは最大1つのコンストラクターメソッドのみを宣言できることに注意してください。静的メソッド、ファクトリクラス、またはオプションのコンストラクタ引数は、PHPクラスのオブジェクトを作成する複数の方法を容易にするいくつかの方法です。

Perl5

Perlプログラミング言語バージョン5では、デフォルトでは、コンストラクターはファクトリメソッド、つまりオブジェクトを作成して返すメソッドであり、具体的には、祝福された参照を作成して返すことを意味します。典型的なオブジェクトはハッシュへの参照ですが、他のタイプへの参照も使用されることはめったにありません。慣例により、唯一のコンストラクターにはnewという名前が付けられますが、それ以外の名前を付けたり、複数のコンストラクターを使用したりすることもできます。たとえば、Personクラスには、newという名前のコンストラクターと、Person属性のファイルを読み取るコンストラクターnew_from_file 、および別のPersonオブジェクトをテンプレートとして使用するnew_from_personが含まれる場合があります

パッケージ Person ; 
#Perlでは、コンストラクターは慣例により「new」と名付けられています。
sub  new  { 
    #クラス名は暗黙的に0番目の引数として渡されます。
    私の $class  =  shift ;

    #デフォルトの属性値(ある場合)。
    私の %defaults  =   foo  =>  "bar"  );

    #デフォルト値と渡された引数の組み合わせとして属性を初期化します。
    私の $self  =  {  %defaults  @  _};

    #必要な引数、クラス不変などをチェックします
    if    定義 $ self- > { first_name }   { 
        die  "Person-> new()に必須属性がありません:first_name" ; 
    } 
    if    定義 $ self- > { last_name }   { 
        die  "Person-> new()に必須属性がありません:last_name" ; 
    } 
    if   defined  $self -> { age } および $self -> { age}  <  18   { 
        die  "Person-> new()の無効な属性値:age <18" ; 
    }

    #Perlは、オブジェクトを'bless'によってクラスに属します。
    $ self $classを祝福し ます; $selfを返します; } 1 ; 
     


Mooseを使用したPerl5

Perl用Mooseオブジェクトシステムでは、この定型文のほとんどを省略でき、デフォルトのnewが作成され、属性を指定できます。また、属性を設定、リセット、または必須にすることができます。さらに、Mooseが生成したコンストラクターが引数をチェックした後に呼び出すBUILDメソッドに、追加のコンストラクター機能を含めることができます。BUILDARGSメソッドを指定して、 hashref / key=>value形式ではないコンストラクター引数を処理できます。

パッケージ Person ; 
#Mooseスタイルのオブジェクト構築を有効にする
use  Moose ;

#名(文字列)は構築時にのみ設定できます('ro')
has  first_name  =>  is  =>  'ro'  isa  =>  'Str'  required  =>  1 ); 
#姓(文字列)は構築時にのみ設定できます('ro')
has  last_name   =>  is  =>  'ro'  isa  =>  'Str'  required  =>  1 ); 
#age(整数)は構築後に変更でき('rw')、
コンストラクターに渡す必要はありません。
#年齢が設定されている場合はtrue
 age         =>  is  =>  'rw'  isa  =>  'Int'  predicate  =>  'has_age' );

#カスタム要件を確認します
sub  BUILD  { 
      my  $ self  =  shift ; 
      if  $ self- > has_age  &&  $ self- > age  <  18  {  #18歳未満の
           死亡 なし"18歳未満の人なし" ; 
      } 
} 
1 ;

どちらの場合も、Personクラスは次のように開始されます。

 Personを使用します; 
my  $ p  =  Person- > new  first_name  =>  'Sam'  last_name  =>  'Ashe'  age  =>  42  );

Python

Pythonでは、コンストラクターは__new__and__init__メソッドの一方または両方によって定義されます。__new__新しいインスタンスは、 and__init__メソッドを呼び出す関数であるかのようにクラスを呼び出すことによって作成されます。コンストラクターメソッドがクラスで定義されていない場合、クラスのメソッド解決順序で次に見つかったものが呼び出されます。[12]

通常の場合、__init__メソッドのみを定義する必要があります。(最も一般的な例外は、不変オブジェクトの場合です。)

>>> class  ExampleClass 
...     def  __new __ cls  value ):
...         print "Creating new instance ..." 
...         #スーパークラスコンストラクターを呼び出してインスタンスを作成します。
...         instance  =  super ExampleClass  cls __new __ cls 
...        インスタンスを返す ... def __init __ self value ):... print
      
        "インスタンスを開始しています..." 
...        自己ペイロード = 
>>> exampleInstance  =  ExampleClass 42 
新しいインスタンスを作成しています...インスタンスを
初期化しています... 
>>> print exampleInstance .payload 42

クラスは通常、それ自体の新しいインスタンスのファクトリとして機能します。つまり、クラスは(関数のような)呼び出し可能なオブジェクトであり、呼び出しはコンストラクタであり、クラスを呼び出すとそのクラスのインスタンスが返されます。ただし、この__new__メソッドは、特殊な目的でクラスのインスタンス以外のものを返すことが許可されています。その場合、__init__は呼び出されません。[13]

Rakuを使用すると、デフォルトの新しいメソッドが継承され、属性を指定できるほか、属性を設定、リセット、または必須にすることができるかどうかを指定して、さらに多くの定型文を省略できます。さらに、カスタム初期化を可能にするために呼び出されるBUILDメソッドに、追加のコンストラクター機能を含めることができます。TWEAKメソッドを指定して、すでに(暗黙的に)初期化されている属性を後処理することができます

class  Person {
     has  Str  $ .first-name  is  required ; #名(文字列)は、
                                      #構築時にのみ設定できます(。は「パブリック」を意味します)。
    Str $.last-name 必要です;  #姓(文字列)は、#構築時にのみ設定できます(!は「プライベート」を意味します)。Int $.agerwです;              #年齢(整数)は、構築('rw')の後に変更できます。#オブジェクトのインスタンス化中には必要ありません。   
                                      
        
                                      
                                      
    
    #個人のフルネームを返す「フルネーム」メソッドを作成します。
    #このメソッドはクラスの外部からアクセスできます。
    メソッド のフルネーム{ $!first-nametc〜""〜 $ last-nametc }

    #年齢が設定されている場合にtrueを返す「has-age」メソッドを作成します。
    #このメソッドはクラス内でのみ使用されるため
    、名前の前に!を付けることで「プライベート」として宣言されます。
    メソッド !has-age { self年齢定義済み}
  
    #カスタム要件
    メソッドを確認する TWEAK {
         if  self has-age && $!age < 18 { # 18歳未満の人は
            死ぬ "18歳未満の人はいない" ;
        }
    }
}

Personクラスは、次のようにインスタンス化されます。

私の $p0 =newfirst-name => 'Sam'last-name => 'Ashe'age => 42);
私の $p1 = Personnewfirst-name => 'grace'last-name => 'hopper');
$p1と言い ます。フルネーム(); #出力:«グレースホッパー␤»

または、Perl6のコロンペア構文を使用し て名前付きパラメーターを指定することもできます。

私の $p0 =new(:first-name <Sam>、:last-name <Ashe>、: age  42 );
私の $p1 = Personnew(:first-name <Grace>、:last-name <Hopper>);

また、名前付きパラメーターと同じ名前の変数を設定した場合は、名前付きパラメーターに変数の名前を使用するショートカットを使用できます。

私の $first-name = "Sam" ;
私の $last-name   = "Ashe" ;
私の $age         = 42 ;
私の $p0 =new(:$ first-name、:$ last-name、:$ age);

ルビー

Rubyでは、コンストラクターは。というメソッドを定義することによって作成されinitializeます。このメソッドは、新しい各インスタンスを初期化するために実行されます。

irb(main):001:0> class  ExampleClass 
irb(main):002:1>   def  initialize 
irb(main):003:2>     puts  "Hello there" 
irb(main):004:2>   end 
irb(main) :005:1> end 
=> nil 
irb(main):006:0> ExampleClass new 
Hello there 
=>#<ExampleClass:0x007fb3f4299118>

Visual Basic.NET

Visual Basic .NETではコンストラクターは「」という名前のメソッド宣言を使用しNewます。

Class  Foobar 
    Private  strData  As  String

    '
    コンストラクターPublicSubNew  ByVal someParam As String strData = someParam End Sub  End Class   
          
     
 
'どこか別のコード'
上記のコンストラクターでオブジェクトをインスタンス化する
DimfooAs  New Foobar  ".NET"   

も参照してください

メモ

  1. ^ Eiffelルーチンは、プロシージャまたは関数のいずれかです。プロシージャにリターンタイプが含まれることはありません。関数には常に戻り型があります。
  2. ^ 継承されたクラス不変条件が満たされる必要があるため、親のコンストラクターへの必須の呼び出しはありません。
  3. ^ Eiffel標準では、最初のアクセス時にフィールドを初期化する必要があるため、オブジェクトの作成中にデフォルトのフィールド初期化を実行する必要はありません。

参照

  1. ^ a b c コンストラクタとデストラクタ、PHPオンラインドキュメントから
  2. ^ データモデル、Pythonオンラインドキュメントから
  3. ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-orderコンストラクター
  4. ^ 「コーディングのすばらしい冒険」エリック・リペット。2013-02-06 2014年4月5日取得
  5. ^ Expert .NET2.0ILアセンブラAPress。2006-01-01。ISBN 97814302022332014年4月5日取得
  6. ^ MSDNのC#の静的コンストラクター
  7. ^ CFComponent
  8. ^ Eiffel ISO/ECMA仕様書
  9. ^ javaのコンストラクターの詳細
  10. ^ 「クラスにコンストラクターを提供する」オラクル株式会社。2013 2013年12月20日取得
  11. ^ OCamlマニュアル
  12. ^ データモデル
  13. ^ データモデル