Существует два основных вида объектов 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 = 1
hobj
является также объектом containers.Map
:
isa(hobj,'containers.Map')
ans = 1
Запрос класса hobj
показывает, что это - объект containers.Map
:
class(hobj)
ans = containers.Map
Функция class
возвращает определенный класс объекта.