В MATLAB вызов
p1.checkOri();
эквивалентен
checkOri(p1);
В обоих случаях метод класса checkOri
вызывается для класса объекта p1
,передача p1
в качестве первого аргумента функции по значению .
Поскольку p1
передается по значению, любые изменения, внесенные в него внутри функции, не видны объектом ввызывая рабочее пространство.Поэтому обычно это делают
p1 = checkOri(p1);
Таким образом, объект, который был передан по значению и изменен внутри функции, передается обратно и присваивается переменной, в которой содержался исходный объект.
Если метод написан следующим образом:
function obj = checkOri(obj)
%...
end
, тогда MATLAB оптимизирует вызов функции выше, так что копия объекта фактически не создается.Обратите внимание, что как в объявлении функции, так и в вызове функции переменная ввода и вывода одинакова.
Как уже было обнаружено OP, вышеприведенное не относится к handle классам , классамкоторые наследуются от handle
.Эти классы действуют так, как будто они всегда передаются по ссылке, и любые изменения, внесенные в них в любом рабочем пространстве, будут отражены во всех других копиях в других рабочих пространствах.
Присвоение переменной-члену также не следует приведенному выше,так что
p1.value = 0;
изменяет объект p1
.
Для получения дополнительной информации о разнице между классами значений и классами дескрипторов см. этот другой вопрос .