FreeBASIC Constructor
目次→言語リファレンス→変数とデータ型→ユーザ定義型→CONSTRUCTOR←オリジナル・サイト
クラスか、ユーザ定義型が、生成されるときに、自動的に呼ばれます。
構文:
Constructor typename ( [ parameters ] ) [ Export ]
statements
End Constructor
パラメタ:
記述:
Constructor メソッドは、ユーザ定義の
Type か
Class 変数が作成されるとき、呼ばれます。
typename は、
Constructor メソッドが、宣言され、定義される、型の名前です。
typename のための名前解決は、
Namespace で使われる手続きと、同じ規則に従います。
Type や
Class に対して複数の構築子が存在する場合がありますが、ユーザー定義の
Type や
Class 変数が作成されたときに呼び出されるのは 1 つだけであり、呼び出される正確な構築子メソッドは、変数が初期化されたときに一致した
parameter 署名によって異なります。
構築子 メソッドの宣言には、複数の
parameter が存在する場合があります。
構築子メソッドは、
typename と同じ型を持った、隠された
this パラメタを渡されます。
this は、
Constructor メソッドで初期化される
Type か
Class の項目にアクセスするために、任意で、使われます。
構築子は、
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