Конструктор класса value возвращает объект, который сопоставлен с переменной, которой он присвоен. Если вы повторно присваиваете эту переменную, MATLAB® создает независимую копию исходного объекта. Если вы передаете эту переменную функции, чтобы изменить его, функция должна возвратить модифицированный объект как выходной аргумент. Для получения информации о поведении класса значения смотрите, Избегают Ненужных Копий Данных.
Конструктор класса handle возвращает объект указателя, который является ссылкой на созданный объект. Можно присвоить объект указателя нескольким переменным или передать его функциям, не заставляя MATLAB сделать копию исходного объекта. Функция, которая изменяет объект указателя, передала, когда входной параметр не должен возвращать объект.
Все классы Handle выведены из абстрактного handle
класс.
По умолчанию классы MATLAB являются классами значения. Следующее определение создает класс значения под названием MyValueClass
:
classdef MyValueClass
...
end
Создать handle
класс, выведите класс из handle
класс.
classdef MyHandleClass < handle
...
end
Фундаментальные классы 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
класс является ссылками на данные об основном объекте. Когда вы копируете объект указателя, 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)
Смотрите Суперкласс Указателя для получения дополнительной информации о классе Handle и его методах.