MATLAB的句柄类和实体值类
3.1 引子:参数的传递
函数的调用
function result = myAdd(a,b)
result = a +b;
end
使用函数
c = myAdd(1,2)
函数空间占用的内存并未显著增加,通过指针调用相关数据。
不到万不得已,不进行局部拷贝(Local Copy)
面向对象的MATLAB同样使用了此技术,即不在函数内部构造局部拷贝也能修改传来参数的值。
3.2 MATLAB的Value类和Handle类
- Value类(数值类)
- Handle类(句柄类)
classdef ImageValue %value类
properties
matrix
end
methods
function obj = ImageValue(N)
obj.matrix = zeros(N,N);
end
end
end
classdef ImageHandle < handle %与value类的区别,handle的基类
properties
matrix
end
methods
function obj = ImageHandle(N)
obj.matrix = zeros(N,N);
end
end
end
但在调用数据时,handle类的实际对象并未计算其内部数据的内存。
handle类在复制时,也仅复制了其对应的指针,并未对数值进行复制(Shallow Copy)。
handle类和value类在赋值上并不改变内存大小,但任意修改与一个值就会重新增加一个拷贝,指向不同的数据。
但在handle类中需要进行分类讨论。
- 不同对象当做函数参数的区别
classdef SimpleValue
properties
var
end
methods
function obj = SimpleValue(var)
obj.var = var;
end
function assignVar(obj,var)
obj.var = var;
end
function obj = setVar(obj,var)
obj.var = var;
end
end
end
classdef SimpleHandle < handle
properties
var
end
methods
function obj = SimpleHandle(var)
obj.var = var;
end
function assignVar(obj,var)
obj.var = var;
end
end
end
运行后
当做对象函数的区别
clear all;clc;
aValue = SimpleValue(20);
aValue.assignVar(10);
aValue.var
%
bHandle = SimpleHandle(20);
bHandle.assignVar(10);
bHandle.var
修改后
% 修改Value类中函数
cValue = SimpleValue(20);
cValue.setVar(10);
cValue.var
问题:此时输出仍无变化?即使将obj作为输出,仍不能保存其内部函数修改值
- 默认值使用的区别
在handle类构造第一个对象的初始值时将其值赋给其他对象。可变化的初值最后不要将其赋为默认值。可以在构造函数中进行赋值。
在value类中则为独立的初始值。 - 使用value类和handle类的情况
举例:RMB:使用value类
customer类:使用handle类
3.3 类的析构函数(Destructor)
- 对象的生存周期
从对象产生占用内存到释放的过程。
function foo()
...
matrix = rand(100,100);
...
end
其matrix的生存周期是从matrix行到end行。
- 析构函数
相关的函数需要delete命名 - 对Object使用clear
value类会消除其值,
handle类则不会消除占用内存。 - 对Object使用delete
value类需要用户自定义,handle类继承了handle的基类。
handle的delete直接将内存数据清除,保留无效的handle类对象。可以将其重新指向新的对象。 - 合法的析构函数
命名:delete
没有返回值
只接收一个参数
可以是private的
MATLAB类方法的种类
- function
- Constructor
- Destructor
- Set,Get
- Static Method
- Abstract Method
- Conversion Method