FreeBASIC マニュアルのトップに戻る

FreeBASIC Constructor

目次→言語リファレンス→変数とデータ型→ユーザ定義型CONSTRUCTOR←オリジナル・サイト

CONSTRUCTOR 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

クラスか、ユーザ定義型が、生成されるときに、自動的に呼ばれます。

構文:
Type typename
declare Constructor ( )
declare Constructor ( [ byref | byval ] parameter as datatype [ = default ] [, ... ] )
End Type

Constructor typename ( [ parameters ] ) [ Export ]
statements
End Constructor

パラメタ:
typename
TypeClass の名前

記述:
Constructor メソッドは、ユーザ定義の TypeClass 変数が作成されるとき、呼ばれます。

typename は、Constructor メソッドが、宣言され、定義される、型の名前です。
typename のための名前解決は、Namespace で使われる手続きと、同じ規則に従います。

TypeClass に対して複数の構築子が存在する場合がありますが、ユーザー定義の TypeClass 変数が作成されたときに呼び出されるのは 1 つだけであり、呼び出される正確な構築子メソッドは、変数が初期化されたときに一致した parameter 署名によって異なります。
構築子 メソッドの宣言には、複数の parameter が存在する場合があります。

構築子メソッドは、typename と同じ型を持った、隠された this パラメタを渡されます。
this は、Constructor メソッドで初期化される TypeClass の項目にアクセスするために、任意で、使われます。

構築子は、typename のグローバルあるいはローカルの静的なインスタンスを宣言する場合、および、New Expression オペレーターを使って、動的に typename を割り付ける場合に、呼ばれます。
異なる構築子の構文については、下記の例を参照してください。

コピー Constructor は、既存のオブジェクトから新しいオブジェクトを初期化する、特別の構築子です。
コピー Constructor が呼ばれる一般的なケースは、以下の3つです:
 1つのオブジェクトのインスタンスを作成し、別のオブジェクトでこれを初期化する場合(1つの指示中で)。
 値によってオブジェクトを渡す場合。
 オブジェクトが、値によって関数から返される場合(Return x 命令文を使って)。
注意:
オブジェクトが、値によって、しかし、Function = x (または function_identifier = x) 代入を使って、関数から返されるとき、Constructor は、最初に一度呼ばれ、各割り当てで Let (Assign) です。

コピー Constructor は、浅い暗黙のコピー Constructor が十分でない場合、定義されなければなりません。
これは、オブジェクトが、特別に構築されるかコピーされる必要がある、動的に割り当てられたメモリか、他の資源を管理する場合に、起こります。
(例えば、メンバー・ポインターが、動的に割り当てられた記憶を示しているならば、潜在的なコピー構築子は、単に潜在的なポインターを構築して、記憶を割り当てる代わりに、値をコピーして、そして、データのコピーを行います。)
注意:
たとえ、明示的なデフォルト Constructor が定義されても、それは暗黙のコピー構築子によって呼ばれません。
コピー Constructor は、そのパラメーター (複製するオブジェクト) を値で宣言することはできません。


入れ子にされた形式の構築子の連鎖は、サポートされています。
自身のデフォルト構築子を持つ全ての項目は、最初に呼ばれます。
コンストラクタの上部にキーワード Constructor(parameters) を使うと、同じ型のコンストラクタを連結することができます。
これは、コンパイラが、項目初期化コードを出力するのを防ぎます(代わりに、チェーン化された構築子を使ってすべてを初期化します)。

Constructor も、他のメンバー・メソッド (Sub) のように、そして同じ構文で(つまり、メンバー・アクセス演算子(例えば obj.Constructor(parameters))を使って)、typename インスタンスから直接呼ばれることができます。
特に、this.Constructor(parameters) の実行は、同じ型の構築子を連鎖させることとして扱われません。また、それは、どんな場所でも(構築子の一番上だけでなく)許可されます。
一般に、手動でオブジェクト上の構築子を呼ぶことは安全ではありません。なぜなら、destructor が呼ばれないからです。そして、古いオブジェクト状態(もしあれば)は、その古いメンバーを破壊することなく、誰なしで上書きされます。それはメモリ/リソース・リークを引き起こすかもしれません。

例:
初心者のための、簡単な構築子の例:
Type MyObj
  Foo As Integer Ptr
 
    '' 整数を生成して、値を設定する Constructor
  Declare Constructor( ByVal DefVal As Integer = 0 )
    '' オブジェクトを削除して、整数を破壊します
  Declare Destructor()
End Type

Constructor MyObj( ByVal DefVal As Integer = 0 )
  Print "MyObj で、新しい整数を作成します!"
  Print "Integer の値は: & DefVal
  Print ""
 
    '' ポインタを生成します。そして
    '' Constructor に渡されたポインタに、その値を設定します。
  This.Foo = New Integer
  *This.Foo = DefVal
End Constructor

Destructor MyObj()
  Print "MyObj で、Integerを削除します!"
  Print ""
 
    '' MyObj に作成したポインタを削除します
  Delete This.Foo
  This.Foo = 0
End Destructor


Scope
    '' MyObj 型オブジェクトを作成します
    '' constructor に、値 10 を送ります
  Dim As MyObj Bar = 10
 
    '' 整数が作成されたかどうかを確認するために、その値を表示します。
  Print "整数の Value は: & *Bar.Foo
  Print ""
 
  Sleep
End Scope
  '' 範囲から、ここで出ます。   Destructor は、今このときに、呼ばれます
  '' オブジェクトを削除しようとしているからです
Sleep

構築子が、他のものの中で多重定義されることを示す、より高度な構築の例:
Type sample

  _text As String

  Declare Constructor ()
  Declare Constructor ( a As Integer )
  Declare Constructor ( a As Single  )
  Declare Constructor ( a As String, b As Byte )

  Declare Operator Cast () As String

End Type

Constructor sample ()
  Print "constructor sample ()"
  Print
  This._text = "Empty"
End Constructor

Constructor sample ( a As Integer )
  Print "constructor sample ( a as integer )"
  Print "  a = "; a
  Print
  This._text = Str(a)
End Constructor

Constructor sample ( a As Single )
  Print "constructor sample ( a as single )"
  Print "  a = "; a
  Print
  This._text = Str(a)
End Constructor

Constructor sample ( a As String, b As Byte )
  Print "constructor sample ( a as string, b as byte )"
  Print "  a = "; a
  Print "  b = "; b
  Print
  This._text = Str(a) + "," + Str(b)
End Constructor

Operator sample.cast () As String
  Return This._text
End Operator

Print "Creating x1"
Dim x1 As sample

Print "Creating x2"
Dim x2 As sample = 1

Print "Creating x3"
Dim x3 As sample = 99.9

Print "Creating x4"
Dim x4 As sample = sample( "aaa", 1 )

Print "Values:"
Print "  x1 = "; x1
Print "  x2 = "; x2
Print "  x3 = "; x3
Print "  x4 = "; x4

copy constructor の例:
Type UDT
  Dim As String Ptr p                     ''pointer to string
  Declare Constructor ()                  ''default constructor
  Declare Constructor (ByRef rhs As UDT)  ''copy constructor
  Declare Destructor ()                   ''destructor
End Type

Constructor UDT ()
  This.p = CAllocate(1, SizeOf(String))
End Constructor

Constructor UDT (ByRef rhs As UDT)
  This.p = CAllocate(1, SizeOf(String))
  *This.p = *rhs.p
End Constructor

Destructor UDT ()
  *This.p = ""
  Deallocate This.p
End Destructor


Dim As UDT u0
*u0.p = "copy constructor exists"
Dim As UDT u = u0
*u0.p = ""  ''コピーされたオブジェクトで、結果コピーの非依存性をチェックします
Print *u.p
Sleep

方言差:

QBからの違い:

参照:
ユーザ定義型 に戻る

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2022-08-15 12:39:26
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

ホームページのトップに戻る

表示-非営利-継承