Больше чем одна переменная может относиться к тому же объекту указателя. Поэтому пользователи взаимодействуют с экземплярами классов Handle по-другому, чем экземпляры классов значения. Понимание, как объекты указателя ведут себя, может помочь вам определить, реализовать ли указатель или класс значения. Эта тема иллюстрирует некоторые из тех взаимодействий.
Для получения дополнительной информации о классах Handle см. Классы Handle.
Определенными видами объектов MATLAB® является handles. Когда переменная содержит указатель, она на самом деле содержит ссылку на объект.
Объекты указателя позволяют больше чем одной переменной относиться к тому же объекту. Поведение объекта указателя влияет на то, что происходит, когда вы копируете объекты указателя и когда вы передаете их функциям.
Все копии переменной объекта указателя относятся к тому же основному объекту. Это ссылочное поведение означает это если h
идентифицирует объект указателя, затем,
h2 = h;
Создает другую переменную, h2
, это называет тот же объект h
.
Например, audioplayer
MATLAB функция создает объект указателя, который содержит данные об источнике аудиосигналов, чтобы воспроизвести определенный звуковой сегмент. Переменная возвращена
audioplayer
функция идентифицирует аудиоданные и позволяет вам к функциям объекта доступа проигрывать аудио.
Программное обеспечение MATLAB включает аудиоданные, которые можно загрузить и использовать, чтобы создать audioplayer
объект. Эти демонстрационные аудиоданные загрузки, создают аудиоплеер и проигрывают аудио:
load gong Fs y gongSound = audioplayer(y,Fs); play(gongSound)
Предположим, что вы копируете gongSound
указатель на объект к другой переменной (gongSound2
):
gongSound2 = gongSound;
Переменные gongSound
и gongSound2
копии того же указателя и, поэтому, относятся к тому же источнику аудиосигналов. Доступ к audioplayer
информация с помощью любой переменной.
Например, установите частоту дискретизации для источника аудиосигналов гонга путем присвоения нового значения SampleRate
свойство. Сначала получите текущую частоту дискретизации и затем установите новую частоту дискретизации:
sr = gongSound.SampleRate; disp(sr)
8192
gongSound.SampleRate = sr*2;
Можно использовать gongSound2
получить доступ к тому же источнику аудиосигналов:
disp(gongSound2.SampleRate)
16384
Проигрывайте звук гонга с новой частотой дискретизации:
play(gongSound2)
Когда вы передаете аргумент функции, функция копирует переменную из рабочей области, в которой вы вызываете функцию в переменную параметра в рабочей области функции.
Передача переменной неуказателя к функции не влияет на исходную переменную, которая находится в рабочей области вызывающей стороны. Например, myFunc
изменяет локальную переменную под названием var
, но когда функция заканчивается, локальная переменная var
больше не существует:
function myFunc(var) var = var + 1; end
Задайте переменную и передайте ее myfunc
:
x = 12; myFunc(x)
Значение x
не изменился после выполнения myFunc(x)
:
disp(x)
12
myFunc
функция может возвратить модифицированное значение, которое вы могли присвоить тому же имени переменной (x
) или другая переменная.
function out = myFunc(var) out = var + 1; end
Измените значение в myfunc
:
x = 12; x = myFunc(x); disp(x)
13
Когда аргумент является переменной указателя, функция копирует только указатель, не объект, идентифицированный тем указателем. Оба указателя (исходная и локальная копия) относятся к тому же объекту.
Когда функция изменяет данные, упомянутые указателем на объект, те изменения доступны от переменной указателя в рабочей области вызова без потребности возвратить модифицированный объект.
Например, modifySampleRate
функционируйте изменяет audioplayer
частота дискретизации:
function modifySampleRate(audioObj,sr) audioObj.SampleRate = sr; end
Создайте audioplayer
объект и передача это к modifySampleRate
функция:
load gong Fs y gongSound = audioplayer(y,Fs); disp(gongSound.SampleRate)
8192
modifySampleRate(gongSound,16384) disp(gongSound.SampleRate)
16384
modifySampleRate
функция не должна возвращать модифицированный gongSound
возразите потому что audioplayer
объекты являются объектами указателя.
Объекты указателя являются членами handle
класс. Поэтому можно всегда идентифицировать объект как указатель с помощью isa
функция. isa
возвращает логический true
(1 ) при тестировании на переменную указателя:
load gong Fs y gongSound = audioplayer(y,Fs); isa(gongSound,'handle')
Чтобы определить, является ли переменная допустимым объектом указателя, используйте isa
и isvalid
:
if isa(gongSound,'handle') && isvalid(gongSound) ... end
Когда объект указателя был удален, переменные указателя, которые сослались на объект, могут все еще существовать. Эти переменные становятся недопустимыми, потому что объект, который они не упоминали больше, существует. Вызов delete
на объекте удаляет объект, но не очищает переменные указателя.
Например, создайте audioplayer
объект:
load gong Fs y gongSound = audioplayer(y,Fs);
Выходной аргумент, gongSound
, переменная указателя. Вызов delete
удаляет объект наряду с информацией об источнике аудиосигналов, которую он содержит:
delete(gongSound)
Однако переменная указателя все еще существует:
disp(gongSound)
handle to deleted audioplayer
whos
команда показывает gongSound
как audioplayer
объект:
whos
Name Size Bytes Class Attributes Fs 1x1 8 double gongSound 1x1 0 audioplayer y 42028x1 336224 double
Значение для Байтов, возвращенных whos
команда не включает данные, на которые ссылается указатель, потому что много переменных могут сослаться на те же данные.
Указатель gongSound
больше не относится к доступному объекту, как показано isvalid
метод указателя:
isvalid(gongSound)
ans = logical 0
Вызов delete
на удаленном указателе ничего не делает и не вызывает ошибку. Можно передать массив, содержащий и допустимые и недопустимые указатели на delete
. MATLAB удаляет допустимые указатели, но не выдает ошибку при обнаружении с указателями, которые уже недопустимы.
Вы не можете получить доступ к свойствам с недопустимой переменной указателя:
gongSound.SampleRate
Invalid or deleted object.
Функции и методы, что свойства объектов доступа вызывают ошибку:
play(gongSound)
Invalid or deleted object.
Удалить переменную, gongSound
, используйте clear
:
clear gongSound
whos
Name Size Bytes Class Attributes Fs 1x1 8 double y 42028x1 336224 double