Существует два основных вида объектов MATLAB ® - дескрипторы и значения .
Объекты значений ведут себя подобно основным типам MATLAB в отношении операций копирования. Копии являются независимыми значениями. Операции, выполняемые с одним объектом, не влияют на копии этого объекта.
На объекты-дескрипторы ссылается их переменная-дескриптор. Копии переменной дескриптора ссылаются на один и тот же объект. Операции, выполняемые с объектом-дескриптором, видны из всех переменных-дескрипторов, ссылающихся на этот объект.
Если вы определяете классы и хотите поддерживать копирование объектов-дескрипторов, см. раздел Реализация копирования для классов-дескрипторов.
Числовые переменные 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;
При копировании vobj1 кому vobj2, а затем измените значение vobj1 собственность a, значение свойства скопированного объекта, vobj2.a, не затрагивается:
vobj2 =vobj1; vobj1.a = 5; vobj2.a
ans =
8
Вот класс дескрипторов под названием HdClass который определяет свойство с именем Data.
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 является дескриптором, который ссылается на созданный объект. Копирование hobj1 кому hobj2 приводит к появлению другого дескриптора, ссылающегося на тот же объект:
hobj2 = hobj1
hobj2 =
HdClass with properties:
Data: 8Поскольку дескрипторы ссылаются на объект, копирование дескриптора копирует его в новое имя переменной, но дескриптор по-прежнему ссылается на тот же объект. Например, учитывая, что hobj1 является объектом-дескриптором со свойством Data:
hobj1.Data
ans =
8Изменение значения hobj1 Data и значение скопированного объекта Data свойство также изменяется:
hobj1.Data = 5; hobj2.Data
ans =
5
Поскольку hobj2 и hobj1 являются дескрипторами того же объекта, изменяя копию, hobj2, также изменяет данные, доступ к которым осуществляется через дескриптор hobj1:
hobj2.Data = 17; hobj1.Data
ans =
17Переназначение переменной-дескриптора приводит к тому же результату, что и переназначение любой переменной MATLAB. При создании объекта и его назначении hobj1:
hobj1 = HdClass(3.14);
hobj1 ссылается на новый объект, а не на тот же объект, на который ссылались ранее (и по-прежнему ссылаются hobj2).
При удалении дескриптора из рабочей области MATLAB удаляет переменную, но не удаляет объект, на который ссылается другой дескриптор. Однако если ссылки на объект отсутствуют, MATLAB уничтожает объект.
Данный hobj1 и hobj2, которые ссылаются на один и тот же объект, можно очистить любой дескриптор, не влияя на объект:
hobj1.Data = 2^8; clear hobj1 hobj2
hobj2 =
HdClass with properties:
Data: 256Если очистить оба hobj1 и hobj2, то ссылки на объект отсутствуют. MATLAB уничтожает объект и освобождает память, используемую этим объектом.
Чтобы удалить объект, на который ссылается любое количество дескрипторов, используйте delete. Данный hobj1 и hobj2, которые оба ссылаются на один и тот же объект, удалите любой дескриптор. MATLAB удаляет объект:
hobj1 = HdClass(8); hobj2 = hobj1; delete(hobj1) hobj2
hobj2 = handle to deleted HdClass
Использовать clear для удаления переменной из рабочей области.
При передаче объекта функции MATLAB передает копию объекта в рабочую область функции. Если функция изменяет объект, MATLAB изменяет только копию объекта, находящегося в рабочей области функции. Различия в поведении копирования между классами дескрипторов и значений важны в таких случаях:
Объект Value - функция должна вернуть измененную копию объекта. Чтобы изменить объект в рабочей области вызывающего абонента, назначьте вывод функции переменной с тем же именем
Объект дескриптора - копия в рабочей области функции ссылается на один и тот же объект. Поэтому функция не должна возвращать измененную копию.
Чтобы определить, является ли объект объектом-дескриптором, используйте isa функция. Если obj является объектом какого-либо класса, этот оператор определяет, obj является дескриптором:
isa(obj,'handle')Например, containers.Map класс создает объект-дескриптор:
hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'});
isa(hobj,'handle')
ans =
1hobj также является containers.Map объект:
isa(hobj,'containers.Map')
ans =
1Запрос класса hobj показывает, что это containers.Map объект:
class(hobj)
ans = containers.Map
class функция возвращает конкретный класс объекта.