Copying Objects
Two Copy Behaviors
There are two fundamental kinds of MATLAB® objects — handles and values.
Value objects behave like MATLAB fundamental types with respect to copy operations. Copies are independent values. Operations that you perform on one object do not affect copies of that object.
Handle objects are referenced by their handle variable. Copies of the handle variable refer to the same object. Operations that you perform on a handle object are visible from all handle variables that reference that object.
Handle Object Copy
If you are defining classes and want to support handle object copy, see Implement Copy for Handle Classes.
Value Object Copy Behavior
MATLAB numeric variables are value objects. For example,
when you copy a to the variable b,
both variables are independent of each other. Changing the value of a does
not change the value of b:
a = 8; b = a;
Now reassign a. b is unchanged:
a = 6; b
b =
8
Clearing a does not affect b:
clear a
b
b =
8Value Object Properties
The copy behavior of values stored as properties in value objects
is the same as numeric variables. For example, suppose vobj1 is
a value object with property a:
vobj1.a = 8;
If you copy vobj1 to vobj2,
and then change the value of vobj1 property a,
the value of the copied object's property, vobj2.a,
is unaffected:
vobj2 =vobj1; vobj1.a = 5; vobj2.a
ans =
8
Handle Object Copy Behavior
Here is a handle class called HdClass that
defines a property called Data.
classdef HdClass < handle properties Data end methods function obj = HdClass(val) if nargin > 0 obj.Data = val; end end end end
Create an object of this class:
hobj1 = HdClass(8)
Because this statement is not terminated with a semicolon, MATLAB displays information about the object:
hobj1 =
HdClass with properties:
Data: 8
The variable hobj1 is a handle that references
the object created. Copying hobj1 to hobj2 results
in another handle referring to the same object:
hobj2 = hobj1
hobj2 =
HdClass with properties:
Data: 8Because handles reference the object, copying a handle copies
the handle to a new variable name, but the handle still refers to
the same object. For example, given that hobj1 is
a handle object with property Data:
hobj1.Data
ans =
8Change the value of hobj1's Data property
and the value of the copied object's Data property
also changes:
hobj1.Data = 5; hobj2.Data
ans =
5
Because hobj2 and hobj1 are
handles to the same object, changing the copy, hobj2,
also changes the data you access through handle hobj1:
hobj2.Data = 17; hobj1.Data
ans =
17Reassigning Handle Variables
Reassigning a handle variable produces the same result as reassigning
any MATLAB variable. When you create an object and assign it
to hobj1:
hobj1 = HdClass(3.14);
hobj1 references the new object, not the
same object referenced previously (and still referenced by hobj2).
Clearing Handle Variables
When you clear a handle from the workspace, MATLAB removes the variable, but does not remove the object referenced by the other handle. However, if there are no references to an object, MATLAB destroys the object.
Given hobj1 and hobj2,
which both reference the same object, you can clear either handle
without affecting the object:
hobj1.Data = 2^8; clear hobj1 hobj2
hobj2 =
HdClass with properties:
Data: 256If you clear both hobj1 and hobj2,
then there are no references to the object. MATLAB destroys the
object and frees the memory used by that object.
Deleting Handle Objects
To remove an object referenced by any number of handles, use delete. Given hobj1 and hobj2,
which both refer to the same object, delete either handle. MATLAB deletes
the object:
hobj1 = HdClass(8); hobj2 = hobj1; delete(hobj1) hobj2
hobj2 = handle to deleted HdClass
Use clear to remove the variable from the
workspace.
Modifying Objects
When you pass an object to a function, MATLAB passes a copy of the object into the function workspace. If the function modifies the object, MATLAB modifies only the copy of the object that is in the function workspace. The differences in copy behavior between handle and value classes are important in such cases:
Value object — The function must return the modified copy of the object. To modify the object in the caller’s workspace, assign the function output to a variable of the same name
Handle object — The copy in the function workspace refers to the same object. Therefore, the function does not have to return the modified copy.
Testing for Handle or Value Class
To determine if an object is a handle object, use the isa function. If obj is
an object of some class, this statement determines if obj is
a handle:
isa(obj,'handle')For example, the containers.Map class creates
a handle object:
hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'});
isa(hobj,'handle')
ans =
1hobj is also a containers.Map object:
isa(hobj,'containers.Map')
ans =
1Querying the class of hobj shows that it
is a containers.Map object:
class(hobj)
ans = containers.Map
The class function returns
the specific class of an object.