Поведение объекта

Два поведения копии

Существует два основных вида объектов 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 возвращает определенный класс объекта.

Похожие темы