Сравнение классов указателя и значения

Основное различие

Конструктор класса value возвращает объект, который сопоставлен с переменной, которой он присвоен. Если вы повторно присваиваете эту переменную, MATLAB® создает независимую копию исходного объекта. Если вы передаете эту переменную функции к изменению его, функция должна возвратить измененный объект как выходной аргумент. Для получения информации о поведении класса значения смотрите, Избегают Ненужных Копий Данных.

Конструктор класса handle возвращает объект указателя, который является ссылкой на созданный объект. Можно присвоить объект указателя нескольким переменным или передать его функциям, не заставляя MATLAB сделать копию исходного объекта. Функция, которая изменяет объект указателя, передала, когда входной параметр не должен возвращать объект.

Все классы Handle выведены от абстрактного класса handle.

Создание класса значения

По умолчанию классы MATLAB являются классами значения. Следующее определение создает класс значения под названием MyValueClass:

classdef MyValueClass 
   ...
end 

Создание класса Handle

Чтобы создать класс handle, выведите класс от класса handle.

classdef MyHandleClass < handle
   ...
end 

Поведение MATLAB встроенные классы

Фундаментальные классы MATLAB являются классами значения (числовой, logical, char, cell, struct и указатель на функцию). Например, если вы создаете объект класса int32 и делаете копию этого объекта, результатом являются два независимых объекта. Когда вы изменяете значение a, значение b не изменяется. Это поведение типично для классов, которые представляют значения.

a = int32(7);
b = a;
a = a^4;
b
   7

Графические объекты MATLAB реализованы, когда указатель возражает, потому что они представляют визуальные элементы. Например, создайте графический объект линии и скопируйте его указатель на другую переменную. Обе переменные относятся к тому же объекту линии.

x = 1:10; y = sin(x);
l1 = line(x,y);
l2 = l1;

Установите свойства объекта линии с помощью любой копии указателя.

set(l2,'Color','red') 
set(l1,'Color','green') 
get(l2,'Color')
ans =

     0     1     0

Вызывание функции delete на указателе l2 уничтожает объект линии. При попытке установить свойство Color на строке l1, функция set возвращает ошибку.

delete(l2)
set(l1,'Color','blue')
Error using matlab.graphics.primitive.Line/set
Invalid or deleted object.

Если вы удаляете объект путем удаления кого-либо из существующих указателей, все копии теперь недопустимы, потому что вы удалили отдельный объект, к которому относятся все указатели.

Удаление объекта указателя не является тем же самым как очищением переменной указателя. В иерархии графического объекта родительский элемент объекта содержит ссылку на объект. Например, родительские оси содержат ссылку на объект линии, упомянутый l1 и l2. Если вы очищаете обе переменные из рабочей области, объект все еще существует.

Для получения дополнительной информации о поведении объектов указателя смотрите Поведение объекта Указателя.

Пользовательские классы значения

MATLAB сопоставляет объекты классов значения с переменными, которым вы присваиваете объект. Когда вы копируете объект значения в другую переменную или передаете объект значения функции, MATLAB создает независимую копию объекта и всех данных, содержавших в объекте. Новый объект независим от изменений в исходном объекте. Объекты значения ведут себя как числовой MATLAB и классы struct. Каждое свойство ведет себя по существу как массив MATLAB.

Объекты значения всегда сопоставляются с одной рабочей областью или временной переменной. Объекты значения выходят из осциллографа, когда их переменная выходит из осциллографа или очищена. Нет никаких ссылок на объекты значения, только копии, которые являются независимыми объектами.

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

Вот класс значения, который хранит значение в его свойстве Number. Значение свойства по умолчанию является номером 1.

classdef NumValue
   properties
      Number = 1
   end
end

Создайте объект NumValue, присвоенный переменной a.

a = NumValue
a = 

  NumValue with properties:

    Number: 1

Присвойте значение a к другой переменной, b.

b = a
b = 

  NumValue with properties:

    Number: 1

Переменные a и b независимы. Изменение значения свойства Number a не влияет на свойство Number b.

a.Number = 7
a = 

  NumValue with properties:

    Number: 7
b
b = 

  NumValue with properties:

    Number: 1

Изменение объектов значения в функциях

Когда вы передаете объект значения функции, MATLAB создает копию того объекта в функциональной рабочей области. Поскольку копии объектов значения независимы, функция не изменяет объект в рабочей области вызывающей стороны. Поэтому функции, которые изменяют объекты значения, должны возвратить измененный объект, который будет повторно присвоен в рабочей области вызывающей стороны.

Для получения дополнительной информации смотрите Объектную Модификацию.

Пользовательские Классы Handle

Экземпляры классов, которые выводят от класса handle, являются ссылками на данные об основном объекте. Когда вы копируете объект указателя, MATLAB копирует указатель, но не копирует данные, хранимые в свойствах объектов. Копия называет тот же объект исходным указателем. Если вы изменяете значение свойства на исходном объекте, скопированный указатель ссылается на то же изменение.

Обработка поведения объекта

Вот класс Handle, который хранит значение в его свойстве Number. Значение свойства по умолчанию является номером 1.

classdef NumHandle < handle
   properties
      Number = 1
   end
end

Создайте NumHandle объекты, присвоенные переменной a.

a = NumHandle
a = 

  NumHandle with properties:

    Number: 1

Присвойте значение a к другой переменной, b.

b = a
b = 

  NumHandle with properties:

    Number: 1

Переменные a и b относятся к тому же основному объекту. Изменение значения свойства Number a также изменяет свойство Number b. Таким образом, a и b относятся к тому же объекту.

a.Number = 7
a = 

  NumHandle with properties:

    Number: 7
b
b = 

  NumHandle with properties:

    Number: 7

Изменение объектов указателя в функциях

Когда вы передаете объект указателя функции, MATLAB создает копию указателя в функциональной рабочей области. Поскольку копии указателей ссылаются на тот же основной объект, функции, которые изменяют объект указателя эффективно, изменяют объект в рабочей области вызывающей стороны также. Поэтому это не необходимо для функций, которые изменяют объекты указателя, переданные как входные параметры, чтобы возвратить измененный объект в вызывающую сторону.

Для получения дополнительной информации смотрите Объектную Модификацию.

Удаление указателей

Можно уничтожить объекты указателя путем явного вызова указателя метод delete. Удаление указателя объекта класса Handle делает все указатели недопустимыми. Например:

a = NumHandle;
b = a;
delete(a)
b.Number
Invalid or deleted object.

Вызов delete на объекте указателя вызывает функцию деструктора или функции для того объекта. См. "Деструктор класса указателей" для получения дополнительной информации.

Инициализация свойств, чтобы содержать объекты указателя

Для получения информации о различиях между инициализацией свойств к значениям по умолчанию в блоке свойств и инициализацией свойств из конструктора, смотрите, Инициализируют Значения свойств и Инициализируют Массивы Объектов Указателя.

Определение равенства объектов

Равенство для объектов значения означает, что объекты имеют тот же класс и имеют то же состояние.

Равенство для объектов указателя означает, что переменные указателя относятся к тому же объекту. Также можно идентифицировать переменные указателя, которые относятся к различным объектам того же класса, которые имеют то же состояние.

Равенство объектов значения

Чтобы определить, одного размера ли объекты значения и их содержимое имеет равную ценность, использует isequal. Например, используйте ранее заданный класс NumValue, чтобы создать два экземпляра и протестировать на равенство:

a = NumValue;
b = NumValue;
isequal(a,b)
ans =

     1

a и b независимы и поэтому не являются тем же объектом. Однако каждый представляет то же значение.

Если вы изменяете значение, представленное объектом значения, объекты более не не равны.

a = NumValue;
b = NumValue;
b.Number = 7;
isequal(a,b)
ans =

     0

Классы значения не имеют метода eq по умолчанию, чтобы реализовать операцию ==.

Равенство объектов указателя

Объекты указателя наследовали метод eq от базового класса handle. Можно использовать == и isequal, чтобы протестировать на два различных отношения среди объектов указателя:

  • Указатели относятся к тому же объекту: == и isequal возвращают true.

  • Указатели относятся к объектам того же класса, которые имеют те же значения, но не являются теми же объектами — только isequal возвращает true.

Используйте ранее заданный класс NumHandle, чтобы создать объект и скопировать указатель.

a = NumHandle;
b = a;

Протестируйте на равенство с помощью == и isequal.

a == b
ans =

     1
isequal(a,b)
ans =

     1

Создайте два экземпляра класса NumHandle с помощью значений по умолчанию.

a = NumHandle;
b = NumHandle;

Определите, относятся ли a и b к тому же объекту.

a == b
ans =

     0

Определите, имеют ли a и b те же значения.

isequal(a,b)
ans =

     1

Функциональность, поддержанная Классами Handle

Получение от класса handle включает ваш класс к:

Смотрите Суперкласс Указателя для получения дополнительной информации о классе Handle и его методах.

Похожие темы