Main Content

オブジェクトのコピー

2 つのコピーの動作

MATLAB® の基本的なオブジェクトには、ハンドルと値の 2 種類があります。

"値" オブジェクトは、コピー操作において MATLAB 基本型のように動作します。コピーは、それぞれ独立した値です。1 つのオブジェクトに操作を実行しても、そのオブジェクトのコピーには影響しません。

"ハンドル" オブジェクトは、ハンドル変数により参照されます。ハンドル変数のコピーは同じオブジェクトを参照します。ハンドル オブジェクトに対して実行する操作は、そのオブジェクトを参照するすべてのハンドル変数から参照することができます。

ハンドル オブジェクトのコピー

クラスを定義する場合で、ハンドル オブジェクトのコピーをサポートするときは、ハンドル クラスのコピーの実装を参照してください。

値オブジェクトのコピーの動作

MATLAB の数値変数は値オブジェクトです。たとえば、a を変数 b にコピーしても、両方の変数は互いに独立です。a の値を変更しても b の値は変わりません。

a = 8;
b = a;

a に再代入します。b は変わりません。

a = 6;
b
b =
     8

a を変更しても、b には影響しません。

clear a
b
b =
     8

値オブジェクトのプロパティ

値オブジェクトにプロパティとして格納されている値のコピーの動作は、数値変数と同様です。たとえば、vobj1 は、プロパティ a をもつ値オブジェクトであるとします。

vobj1.a = 8; 

vobj1vobj2 にコピーした後 vobj1 のプロパティ a の値を変更しても、コピーされたオブジェクトのプロパティの値 vobj2.a には影響しません。

vobj2 =vobj1;
vobj1.a = 5;
vobj2.a
ans =
     8

ハンドル オブジェクトのコピーの動作

次に示すのは、Data というプロパティを定義する HdClass というハンドル クラスです。

classdef HdClass < handle
   properties
      Data
   end
   methods
      function obj = HdClass(val)
         if nargin > 0
            obj.Data = val;
         end
      end
   end
end

このクラスのオブジェクトを作成します。

hobj1 = HdClass(8)

このステートメントはセミコロンで終わらないので、MATLAB によってオブジェクトに関する情報が表示されます。

hobj1 = 

  HdClass with properties:

    Data: 8

変数 hobj1 は、作成されたオブジェクトを参照するハンドルです。hobj1hobj2 にコピーすると、同じオブジェクトを参照する別のハンドルになります。

hobj2 = hobj1
hobj2 = 

  HdClass with properties:

    Data: 8

ハンドルはオブジェクトを参照するので、ハンドルをコピーすると新しい変数名へハンドルがコピーされますが、ハンドルは引き続き同じオブジェクトを参照します。たとえば、hobj1 がプロパティ Data をもつハンドル オブジェクトだとします。

hobj1.Data
ans =

     8

hobj1Data プロパティの値が変化し、コピーされたオブジェクトの Data プロパティの値も変化します。

hobj1.Data = 5;
hobj2.Data
ans =

     5

hobj2hobj1 は同じオブジェクトに対するハンドルなので、コピーである hobj2 を変更すると、ハンドル hobj1 を介してアクセスするデータも変化します。

hobj2.Data = 17;
hobj1.Data
ans =

    17

ハンドル変数の再代入

ハンドル変数を再代入すると、他の MATLAB 変数を再代入する場合と同じ結果になります。オブジェクトを作成して hobj1 に代入するには、次のようにします。

hobj1 = HdClass(3.14);

hobj1 では、以前に参照していた同じオブジェクトではなく、新規のオブジェクトが参照されます。なお、hobj2 では引き続き以前のオブジェクトが参照されます。

ハンドル変数のクリア

ワークスペースからハンドルをクリアすると、MATLAB はその変数を削除しますが、別のハンドルによって参照されるオブジェクトは削除しません。ただし、オブジェクトへの参照がない場合、MATLAB はオブジェクトを破棄します。

同じオブジェクトを参照する hobj1hobj2 が与えられた場合に、オブジェクトに影響せずにいずれかのハンドルをクリアすることができます。

hobj1.Data = 2^8;
clear hobj1
hobj2
hobj2 = 

  HdClass with properties:

    Data: 256

hobj1hobj2 の両方をクリアすると、オブジェクトに対する参照がなくなります。MATLAB はオブジェクトを破棄し、そのオブジェクトで使用されるメモリを解放します。

ハンドル オブジェクトの削除

任意数のハンドルで参照されるオブジェクトを削除するには、delete を使用します。同じオブジェクトを参照する hobj1hobj2 が与えられた場合に、いずれかのハンドルを削除します。MATLAB はオブジェクトを削除します。

hobj1 = HdClass(8);
hobj2 = hobj1;
delete(hobj1)
hobj2
hobj2 = 

  handle to deleted HdClass

ワークスペースから変数を削除するには、clear を使用します。

オブジェクトの変更

オブジェクトを関数に渡すと、MATLAB はオブジェクトのコピーを関数ワークスペースに渡します。関数がオブジェクトを変更する場合、MATLAB は関数ワークスペース内のオブジェクトのコピーのみを変更します。次のような場合、ハンドル クラスと値クラス間でのコピー動作の違いは重要です。

  • 値オブジェクト — 関数は、オブジェクトの変更されたコピーを返さなければなりません。呼び出し側ワークスペースのオブジェクトを変更するには、関数の出力を同じ名前の変数に代入します。

  • ハンドル オブジェクト — 関数ワークスペース内のコピーは同じオブジェクトを参照します。したがって、関数は変更されたオブジェクトを返す必要はありません。

ハンドル クラスまたは値クラスの判定

オブジェクトがハンドル オブジェクトかどうかを判定するには、関数 isa を使用します。obj があるクラスのオブジェクトの場合、次のステートメントは obj がハンドルかどうかを判定します。

isa(obj,'handle')

たとえば、containers.Map クラスは、ハンドル オブジェクトを作成します。

hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'});
isa(hobj,'handle')
ans =

     1

hobjcontainers.Map オブジェクトです。

isa(hobj,'containers.Map')
ans =

     1

hobj のクラスをクエリすると containers.Map オブジェクトであることがわかります。

class(hobj)
ans =

containers.Map

関数 class はオブジェクトの特定のクラスを返します。

関連するトピック