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