Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ハンドル オブジェクトの配列の初期化

ハンドル オブジェクトの配列を初期化する際、MATLAB® は配列の空要素を既定のオブジェクトで埋めます。既定のオブジェクトを作成するため、MATLAB は以下を行います。

  • クラス コンストラクターを一度呼び出してオブジェクトを取得する

  • 配列の各要素に一意のハンドルを作成する

  • コンストラクターを再度呼び出さずに、構築された既定のオブジェクトからプロパティ値をコピーする

InitHandleArray クラスによってこの動作が示されています。

classdef InitHandleArray < handle
   properties
      RandNumb
   end
   methods
      function obj = InitHandleArray
         obj.RandNumb = randi(100);
      end
   end
end

RandNumb プロパティには InitHandleArray コンストラクターが代入する乱数が含まれています。

配列の最後の要素への代入によって作成された配列を MATLAB が初期化すると、何が起こるかを考えてみます (最後の要素は、インデックス値が最も大きい要素です)。要素 A(4,5) に代入されている InitHandleArray オブジェクトの RandNumb プロパティの値が 59 であるとします。

A(4,5) = InitHandleArray;
A(4,5).RandNumb
ans =

     59

インデックス A(4,5) の位置にある要素は、InitHandleArray クラスのインスタンスです。要素 A(1,1) で使用されている既定のオブジェクトも InitHandleArray クラスのインスタンスですが、その RandNumb プロパティは別の乱数に設定されています。

先行の配列要素を埋めるため、MATLAB はクラス コンストラクターを呼び出して 1 つのオブジェクトを作成します。MATLAB はこのオブジェクトを残りのすべての配列要素にコピーします。コンストラクターを呼び出して既定のオブジェクトを作成した結果、関数 randi の呼び出しがもう 1 回行われ、新しい乱数が返されます。

A(1,1).RandNumb
ans =

     10

MATLAB はこの 2 番目のインスタンスの値を配列の残りのすべての要素にコピーします。

A(2,2).RandNumb
ans =

     10
A(2,3).RandNumb
ans =

    10

オブジェクト配列を初期化するとき、MATLAB は単一のオブジェクトのコピーを配列の空の要素に割り当てます。MATLAB は、後から各オブジェクトに異なるプロパティ値を代入できるよう、各オブジェクトに一意のハンドルを付与します。各オブジェクトは等価ではありません。

A(1,1) == A(2,2)
ans =

     0

すなわち、ハンドル A(1,1)A(2,2) と同じオブジェクトを参照しないということです。次のようなステートメントで配列を作成すると、

A(4,5) = InitHandleArray;

クラス コンストラクターが 2 回呼び出されます。最初の呼び出しでは、配列要素 A(4,5) のオブジェクトが作成されます。2 回目の呼び出しでは、MATLAB により残っている空の配列要素すべてにコピーされる、既定のオブジェクトが作成されます。

関連情報

配列操作の詳細については、多次元配列を参照してください。

値をプロパティに割り当てる方法の詳細は、プロパティのハンドル オブジェクトへの初期化を参照してください。

クラスに対して subsasgn メソッドを実装する方法の詳細は、オブジェクト配列インデックス付けを参照してください。