Существует два основных вида объектов MATLAB® — указатели и значения.
Объекты Value ведут себя как фундаментальные типы MATLAB относительно операций копии. Копии являются независимыми значениями. Операции, которые вы выполняете на одном объекте, не влияют на копии того объекта.
На объекты Handle ссылается их переменная указателя. Копии переменной указателя относятся к тому же объекту. Операции, которые вы выполняете на объекте указателя, видимы от всех переменных указателя та ссылка тот объект.
Если вы задаете классы и хотите поддержать копию объекта указателя, см. Копию Реализации для Классов Handle.
Числовые переменные 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
Вот класс Handle под названием 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Измените значение свойства Data hobj1, и значение свойства 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 возвращает определенный класс объекта.