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

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

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

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

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

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

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

classdef MyValueClass 
   ...
end 

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

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

classdef MyHandleClass < handle
   ...
end 

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

Фундаментальные классы MATLAB являются классами значения (числовой, logical'char'ячейка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 и его методах.

Похожие темы