目录

类构造函数方法

类构造函数方法的目的

构造函数方法的基本结构

构造函数的指导原则

默认构造函数

何时定义构造函数

初始化构造函数中的对象

构造函数不要求输入参数的情况

子类构造函数

对继承的构造函数的隐式调用

类构造过程中的错误

禁止显示输出对象


类构造函数方法

类构造函数方法的目的

构造函数方法是一个创建类实例的特殊函数。通常,构造函数方法接受输入参数来指定存储在属性中的数据,并返回初始化的对象。

所有 MATLAB® 类都有默认的构造函数方法。此方法返回在没有输入参数的情况下创建的类的对象。类可以定义覆盖默认构造函数的构造函数方法。显式定义的构造函数可以接受输入参数、初始化属性值、调用其他方法以及执行创建类对象所需的其他操作。

构造函数方法的基本结构

构造函数方法的结构包含三个基本部分:

  • 初始化前 - 计算超类构造函数的参数。

  • 对象初始化 - 调用超类构造函数。

  • 初始化后 - 执行任何与子类相关的操作,包括对象的引用和赋值、调用类方法、将对象传递给函数等。

以下代码说明在每个部分执行的基本操作:

classdef ConstructorDesign < BaseClass1propertiesComputedValueendmethodsfunction obj = ConstructorDesign(a,b,c)%% Pre Initialization %%% Any code not using output argument (obj)if nargin == 0% Provide values for superclass constructor% and initialize other inputsa = someDefaultValue;args{1} = someDefaultValue;args{2} = someDefaultValue;else% When nargin ~= 0, assign to cell array,% which is passed to supclass constructorargs{1} = b;args{2} = c;endcompvalue = myClass.staticMethod(a);%% Object Initialization %%% Call superclass constructor before accessing object% You cannot conditionalize this statementobj = obj@BaseClass1(args{:});%% Post Initialization %%% Any code, including access to objectobj.classMethod(arg);obj.ComputedValue = compvalue;...end...end
...
end

像调用任何函数一样调用构造函数,传递参数并返回类的对象。

obj = ConstructorDesign(a,b,c);

构造函数的指导原则

  • 构造函数与类同名。

  • 构造函数可以返回多个参数,但第一个输出必须为创建的对象。

  • 如果不想对输出参数赋值,可以在构造函数中清除对象变量。

  • 如果创建类构造函数,请确保可以在没有输入参数的情况下调用它。

  • 如果构造函数对超类构造函数进行显式调用,则该调用必须发生在对构造对象的任何其他引用之前,并且不能发生在return语句后。

  • 对超类构造函数的调用不能为条件调用。您不能在循环、条件、switch、try/catch 或嵌套函数中放置超类构造调用。

默认构造函数

如果类没有定义构造函数,则 MATLAB 提供默认构造函数,它不接受任何参数,并返回一个标量对象,该对象的属性初始化为属性的默认值。由 MATLAB 提供的默认构造函数也调用所有超类构造函数,其中可以不将任何参数传递给默认子类构造函数,也可以将任何参数传递给默认子类构造函数。

当子类没有定义构造函数时,默认构造函数将其输入传递给直接超类构造函数。当子类不需要定义构造函数而超类构造函数需要输入参数时,此行为很有用。

何时定义构造函数

当需要执行默认构造函数无法执行的对象初始化时,可以定义构造函数方法。例如,当创建类的对象需要:

  • 输入参数时

  • 初始化类的每个实例的对象状态(例如属性值)时

  • 用子类构造函数确定的值调用超类构造函数时

初始化构造函数中的对象

构造函数方法将初始化的对象以输出参数形式返回。输出参数是在构造函数执行时,在执行第一行代码之前创建的。

例如,以下构造函数可以将为对象的属性A的赋值作为第一个语句,因为已将对象obj指定给MyClass的一个实例。

function obj = MyClass(a,b,c)obj.A = a;...
end

可以从构造函数调用其他类方法,因为对象已初始化。构造函数还会创建一个对象,该对象的属性具有默认值 - 空值 ([]) 或属性定义代码块中指定的默认值。

例如,以下构造函数对输入参数进行运算,以为Value属性赋值。

function obj = MyClass(a,b,c)obj.Value = (a + b) / c;...
end

在构造函数中引用对象

在初始化对象(例如,通过给属性赋值)时,使用输出参数的名称来引用构造函数中的对象。例如,在以下代码中,输出参数是obj,而对象也被引用为obj:

% obj is the object being constructed
function obj = MyClass(arg)obj.propert1 = arg*10;obj.method1;...
end

构造函数不要求输入参数的情况

在某些情况下,必须能够在没有输入参数的情况下调用构造函数:

  • 将对象加载到工作区时,如果将类的 ConstructOnLoad 属性设置为 true,则 load 函数将不带参数调用类构造函数。

  • 在创建或扩展对象数组时,如果并非所有元素都有特定值,则将以不带参数的方式调用类构造函数来填充未指定的元素(例如,x(10,1) = MyClass(a,b,c);)。在这种情况下,将不带参数调用构造函数一次,以用此对象的副本填充空数组元素 (x(1:9,1))。

如果没有输入参数,构造函数仅使用默认属性值创建对象。最好在类构造函数中添加零参数检查,以防止在出现这两种情况时报错:

function obj = MyClass(a,b,c)if  nargin > 0obj.A = a;obj.B = b;obj.C = c;...end
end

子类构造函数

子类构造函数可以显式调用超类构造函数来将参数传递给超类构造函数。子类构造函数必须在对超类构造函数的调用中指定这些参数,并且必须使用构造函数输出参数来进行调用。语法如下:

classdef MyClass < SuperClassmethodsfunction obj = MyClass(a,b,c,d)obj@SuperClass(a,b);...endend
end

子类构造函数对超类构造函数的所有调用都必须发生在对 (obj) 对象的任何其他引用之前。此限制包括为属性赋值或调用普通类方法。此外,子类构造函数只能调用超类构造函数一次。

仅引用指定的超类

如果classdef没有将类指定为超类,则构造函数将无法使用此语法来调用超类构造函数。也就是说,子类构造函数只能调用classdef 行中列出的直接超类构造函数。

classdef MyClass < SuperClass1 & SuperClass2

MATLAB 按从左到右的顺序调用任何未调用的构造函数,这些构造函数在classdef 行中指定。MATLAB 对这些调用不传递任何参数。

对超类构造函数的无条件调用

对超类构造函数的调用必须为无条件调用。对给定超类只能调用一次。请在使用对象之前调用超类构造函数,以初始化对象的超类部分(例如,为属性赋值或调用类方法)。

要使用依赖于某些条件的不同参数调用超类构造函数,请构建参数的元胞数组,并提供对该构造函数的一次调用。

例如,当不带参数调用 Cube 构造函数时,Cube类构造函数将使用默认值调用超类Shape构造函数。如果使用四个输入参数调用 Cube 构造函数,则会将upvector和viewangle传递给超类构造函数:

classdef Cube < ShapepropertiesSideLength = 0Color = [0 0 0]endmethodsfunction cubeObj = Cube(length,color,upvector,viewangle)% Assemble superclass constructor argumentsif nargin == 0super_args{1} = [0 0 1];super_args{2} = 10;elseif nargin == 4super_args{1} = upvector;super_args{2} = viewangle;elseerror('Wrong number of input arguments')end% Call superclass constructorcubeObj@Shape(super_args{:});% Assign property values if providedif nargin > 0 cubeObj.SideLength = length;cubeObj.Color = color;end...end...end
end

零个或多个超类参数

要支持不带参数调用超类构造函数的语法,请显式提供以下语法。

假设在 Cube 类示例中,Shape 超类和 Cube 子类中的所有属性值都在类定义中指定了默认值。然后,您可以创建 Cube 的实例,而无需为超类或子类构造函数指定任何参数。

下面说明如何在 Cube 构造函数中实现此行为:

methodsfunction cubeObj = Cube(length,color,upvector,viewangle)% Assemble superclass constructor argumentsif nargin == 0 super_args = {};elseif nargin == 4super_args{1} = upvector;super_args{2} = viewangle;elseerror('Wrong number of input arguments')end% Call superclass constructorcubeObj@Shape(super_args{:});% Assign property values if providedif nargin > 0 cubeObj.SideLength = length;cubeObj.Color = color;end...end
end

对继承的构造函数的隐式调用

MATLAB 将参数从默认子类构造函数隐式传递给超类构造函数。这样,就无需仅为了将参数传递给超类构造函数,而为子类实现一个构造函数方法。

例如,以下类构造函数需要输入参数(datatime对象),该参数由构造函数指定给 CurrentDate 属性。

classdef BaseClassWithConstrpropertiesCurrentDate datetimeendmethodsfunction obj = BaseClassWithConstr(dt)obj.CurrentDate = dt;endend
end

假设创建了BaseClassWithConstr的一个子类,但是,子类不需要显式构造函数方法。

classdef SubclassDefaultConstr < BaseClassWithConstr...
end

可以通过用超类参数调用默认构造函数来构造SubclassDefaultConstr的对象:

obj = SubclassDefaultConstr(datetime);

类构造过程中的错误

对于句柄类,在下列情况下出现错误时,MATLAB 会调用delete方法:

  • 在错误发生前,代码中存在对对象的引用。

  • 在错误发生前,代码中存在较早的return语句。

MATLAB 对对象调用delete方法,对属性中包含的任何对象调用delete方法,对任何初始化的基类调用delete方法。

根据错误发生的时间,MATLAB 可以在对象完全构造之前调用类析构函数。

因此,类 delete 方法必须能够对部分构造的对象进行操作,这些对象可能没有所有属性的值。

禁止显示输出对象

当在对构造函数的调用中没有指定输出变量时,可以禁止将类实例赋给ans变量。这种编程方式对于创建图形界面窗口的 App 非常有用,这些窗口会保留构造的对象。这些 App 不需要返回对象。

使用nargout来确定是否带输出参数调用了构造函数。例如,如果调用时未指定输出,则 MyApp 类的类构造函数会清除对象变量 obj:

classdef MyAppmethodsfunction obj = MyApp...if nargout == 0clear objendend...end
end

当类构造函数不返回对象时,MATLAB 不会触发meta.class InstanceCreated 事件。

Matlab中类构造函数方法相关推荐

  1. 数学建模matlab imread,《matlab数学建模方法与实践》第三章 数据的处理

    3.1数据的获取 3.1.1从Excel中读取数据 a= xlsread('路径',n(sheetn),'A(n-1):Bn(读入的数据范围)') 3.1.2从TXT中读取数据 3.1.2.1.1 同 ...

  2. Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset

    原文 Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset DataSet相当你用的数据库: DataTable相当于你的表.一个 DataSet 可以包含多个 DataTab ...

  3. 光流 | 基于Matlab实现Lucas-Kanade方法:方法2(附源代码)

    github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 基于Matlab实现Lucas-Kanad ...

  4. 光流 | 基于Matlab实现Lucas-Kanade方法:方法1(附源代码)

    github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 基于Matlab实现Lucas-Kanad ...

  5. gps数据处理matlab,基于Matlab的数据处理方法在GPS高程拟合中的应用

    基于Matlab的数据处理方法在GPS高程拟合中的应用 在分析GPS高程异常拟合模型实质的基础上,结合工程实例,顾及地球重力场的空间连续性特点,运用Matlab中的拟合插值函数Griddata等进行高 ...

  6. C/C++ VS中调用matlab函数的方法

    C/C++ VS中调用matlab函数的方法 [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/73743654 Matla ...

  7. html5创建对象的方法,JavaScript面向对象-使用工厂方法和构造函数方法创建对象...

    在上一篇文章中我们介绍了JavaScript简单对象的创建方法,简单js对象的最大问题是由于没有类的约束,无法实现对象的重复利用,并且没有一种约定,在操作时会带来问题.所以人们从设计模式中借用了一种工 ...

  8. matlab用for编写乘法表,实验二 Matlab程序设计基本方法1

    实验二Matlab程序设计基本方法 覃照乘自092 电气工程学院 一.实验目的: 1.熟悉MATLAB 程序编辑与设计环境 2.掌握各种编程语句语法规则及程序设计方法 3.函数文件的编写和设计 4.了 ...

  9. bms用matlab吗,一种BMS的MATLAB建模集成方法与流程

    技术特征: 1.一种BMS的MATLAB建模集成方法,其特征在于,包括以下步骤: S01:将BMS分为输入模块.输出模块及若干个中间模块,并定义各模块的名称: S02:定义各模块的输入端口和输出端口的 ...

最新文章

  1. R语言ggplot2可视化绘制累积计数图(累加图,cumulative counts)
  2. Electron-Nodejs-Addon入门
  3. 为什么在iOS7中,UITableView顶部的UITableViewStyleGrouped样式具有额外的填充
  4. Zookeeper----基本原理
  5. linux中如何让vim永久显示行号(永久显示+临时显示)
  6. get请求和post请求乱码问题
  7. Semaphore1.8源码
  8. java ee笔试题_【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(六)
  9. 机器数与码制——如何在计算机内部存储数字、进行数据运算
  10. python在生态学领域运用_科学网-那些生态学可能会用到的工具软件-张金龙的博文...
  11. 人脸数据库汇总 (来自网络)
  12. 【安装版】mysql数据库安装指南(超级详细)
  13. [转载] 羽毛球——学打羽毛球 04 正手发高远球
  14. 【转】一个女孩的上海5年
  15. 阿里二面:Redis有几种集群方案?我答了4种
  16. 因错误配置第三方服务,已有过亿用户数据遭到泄露
  17. VUE中:printJS使用,附带JsBarcode条码生成器,网页转图片html2canvas,base64上传保存处理,二维码生成库qrcode,二维码/条码扫描识别,domtoimage
  18. 哪一款电容笔比较好用?平板电脑高性价比电容笔推荐
  19. 嵌入式笔试/面试概念
  20. mysql 获取倒数第二_MySQL查询倒数第二条记录实现方法

热门文章

  1. Google Colab 无敌详细使用教程
  2. Stata计算莫兰指数基本步骤
  3. [HDU 1207] 汉诺塔II (四柱汉诺塔)
  4. 小技巧(5):将TT100K数据集转成VOC格式,并且用Python脚本选出45类超过100张的图片和XML
  5. 计算机弹奏最美情侣,抖音短视频就在一起是什么歌?最美情侣BGM分享
  6. github怎么给别人看私密项目_关于Github的使用--创建私密仓库
  7. 特斯拉依旧头铁坚持视觉路线,激光雷达会笑到最后吗?
  8. 【Unity3D进阶4-5】Unity3D VR的开发
  9. 加码无人配送,美团要干掉骑手?
  10. QQ/微信授权登录js