Больше чем одна переменная может относиться к тому же объекту указателя. Поэтому пользователи взаимодействуют с экземплярами классов 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