Sha*_*hai 14 oop matlab destructor
在Matlab我有一堂课
classdef myClass
properties
% some properties here...
end
methods ( Access = 'public' )
function obj = myClass()
% constructor...
end
function obj = delete( obj )
% suppose to be destructor...
fprintf(1, 'delete\n');
end
end % public methods
end
Run Code Online (Sandbox Code Playgroud)
当我clear是一个类型的变量时,Matlab的默认行为是myClass什么?例如:
>> m = myClass();
>> clear m
Run Code Online (Sandbox Code Playgroud)
我希望Matlab m在这个阶段调用析构函数,但它似乎没有!
我的问题:
clear在变量变量时如何强制调用析构函数?
这是Matlab的默认行为吗?clear在变量变量时调用析构函数是不是更合乎逻辑?
是否有可能Matlab的类没有析构函数方法(也就是说,在销毁类时没有默认方法)?或者我错过了什么?
是否有可能只有派生的类handle具有析构函数(delete方法)?
谢谢!
编辑:按照乔纳斯的回答,简要总结:
Matlab有两种类型:值类(默认)和句柄类(从handle超类派生).值类往往提供更好的性能,但是,它们没有析构函数.
handle类有一个析构函数:delete在类被销毁时调用.有关类析构函数的更多详细信息,请参阅此问题handle.
如果希望为值类具有类似析构函数的功能,Jona的答案提出了一种利用onCleanup功能的方法.
感谢您的好答案和富有洞察力的评论!
Jon*_*nas 13
Delete仅被定义为句柄类的类析构函数,而不是值类(因此Q4的答案为"是",请参阅文档的上一个链接).值类与标准Matlab数组非常相似,因为它们是通过值而不是通过引用传递的,并且许多内部结构(例如析构函数)对用户是隐藏的.作为交换,他们通常更快(参见例如这个SO问题).
因此,如果您想要调用delete方法,我建议使用onCleanup功能(请注意,delete(m)实际上不会删除任何内容,因此您可能希望将其设为私有方法).
classdef myTestClass
properties
% some properties here...
end
properties (Hidden)
cleanup
end
methods ( Access = 'public' )
function obj = myTestClass()
% constructor...
obj.cleanup = onCleanup(@()delete(obj));
end
end
methods ( Access = 'private' )
%# I suggest hiding the delete method, since it does not
%# actually delete anything
function obj = delete( obj )
fprintf(1, 'delete\n');
end
end % public methods
end
Run Code Online (Sandbox Code Playgroud)