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

Поведение двух копий

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

Похожие темы