Существует два основных вида MATLAB® объекты - указатели и значения.
Value объекты ведут себя как основные типы MATLAB в отношении операций копирования. Копии являются независимыми значениями. Операции, которые вы выполняете для одного объекта, не влияют на копии этого объекта.
Handle объекты ссылаются на их переменную handle. Копии переменной 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
<reservedrangesplaceholder0>
свойство и значение копируемых Data
объекта изменяется также свойство:
hobj1.Data = 5; hobj2.Data
ans = 5
Потому что hobj2
и hobj1
являются указателями на один и тот же объект, меняя копию, hobj2
, также изменяет данные, к которым вы обращаетесь через указатель hobj1
:
hobj2.Data = 17; hobj1.Data
ans = 17
Переназначение переменной handle приводит к тому же результату, что и переназначение любого переменного 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
функция возвращает определенный класс объекта.