Больше чем одна переменная может относиться к тому же объекту указателя. Поэтому пользователи взаимодействуют с экземплярами классов Handle по-другому, чем экземпляры классов значения. Понимание, как объекты указателя ведут себя, может помочь вам определить, реализовать ли указатель или класс значения. Эта тема иллюстрирует некоторые из тех взаимодействий.
Для получения дополнительной информации о классах Handle см. Классы Handle.
Определенные виды объектов MATLAB® являются указателями. Когда переменная содержит указатель, она на самом деле содержит ссылку на объект.
Объекты указателя позволяют больше чем одной переменной относиться к тому же объекту. Поведение объекта указателя влияет на то, что происходит, когда вы копируете объекты указателя и когда вы передаете их функциям.
Все копии переменной объекта указателя относятся к тому же основному объекту. Это ссылочное поведение означает это, если 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