基于MATLAB的面向对象编程(2)——句柄类和实值类

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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值