创建和初始化对象数组
您可以创建由基于类的对象组成的数组,其索引行为类似于内置类型,如 double
或 string
。然而,创建对象数组需要特别注意对象是如何构造的。
使用循环创建对象数组
定义类 SimpleValue
,它有一个具有初始值的属性和默认的无参数参数构造函数。
classdef SimpleValue properties prop1 = 0 end end
使用循环创建一个由 SimpleValue
对象组成的数组。
for k = 1:5 objArray(k) = SimpleValue; end
使用数组索引引用特定对象的属性并对其进行赋值。例如,将值 5
赋给 objArray(1)
的 prop1
属性。
objArray(1).prop1 = 5;
返回所有对象的 prop1
的值并将它们赋给一个向量。
p = [objArray.prop1]
p = 5 0 0 0 0
有关访问对象数组的属性和方法的详细信息,请参阅Accessing Properties and Methods in Object Arrays。
通过构造最后一个元素创建对象数组
在 SimpleValue
示例中,objArray
中的对象是以循环方式使用默认的无参数构造函数和初始属性值创建的。您还可以通过构造数组的最后一个元素来创建一个 SimpleValue
对象数组。
例如,创建一个由 SimpleValue
对象组成的 2×2 数组。
a(2,2) = SimpleValue
a = 2×2 SimpleValue array with properties: prop1
当您以这种方式创建一个对象数组时,MATLAB® 会采用以下两种方法之一来填充该数组的其余元素,具体取决于类是值还是句柄。
值类数组
在构造由值类对象组成的数组中的最后一个元素后,MATLAB 会执行以下操作:
调用一次无参数构造函数
用该实例的副本填充其余元素
如果要使用构造函数的输入来初始化属性值,您还必须在构造函数中有一个无参数选项。
例如,向 SimpleValue
添加一个构造函数,该构造函数接受输入并将该输入赋给 prop1
。
classdef SimpleValue properties prop1 = 0 end methods function obj = SimpleValue(v) if nargin > 0 obj.prop1 = v; end end end end
通过用输入参数 7
构造 b(5)
来创建一个 1×5 数组。
b(5) = SimpleValue(7);
返回所有 prop1
值,并将它们赋给向量 y
。b(5)
中对象的 prop1
值为 7
。MATLAB 会调用一次无参数构造函数,并将值复制到数组中其余的所有元素。这些元素的初始 prop1
值为 0
。
y = [b.prop1]
y = 0 0 0 0 7
如果 SimpleValue
构造函数无法处理无参数调用,则 MATLAB 在尝试填充 b(1)
到 b(4)
时会出错。
句柄类数组
在构造由句柄类对象组成的数组中的最后一个元素后,MATLAB 会执行以下操作:
为数组的每个元素创建唯一句柄
从数组中的最后一个对象复制属性值
使用这些复制的值为数组的其余部分创建对象,而不调用构造函数
与值类的情况不同,MATLAB 不会调用构造函数来填充数组,因此该数组中的所有对象都以相同的属性值开头。例如,定义一个为其属性生成随机数的句柄类。
classdef InitHandleArray < handle properties RandNum end methods function obj = InitHandleArray obj.RandNum = randi(100); end end end
通过构造 c(5)
创建一个新的 1×5 数组,并验证 prop1
值。为了创建该数组,MATLAB 会调用构造函数两次。第一次调用时,MATLAB 对 c(5).RandNum
赋值。第二次调用时,它将调用的结果赋给 randi
来创建 c(1)
。最后,它将该 RandNum
值复制到 c
中的其余元素。
c(5) = InitHandleArray; z = [c.RandNum]
z = 91 91 91 91 82
尽管 MATLAB 不需要在构造函数中使用无参数选项来创建句柄类数组,但对于所有类构造函数来说,仍然推荐使用无参数选项。
在构造函数中创建对象数组
您还可以使用类构造函数本身来创建和返回一个对象数组。例如,ObjectArray
类会创建一个与二维输入数组 F
大小相同的对象数组。然后,构造函数将每个对象的 Value
属性初始化为对应的输入数组值。
classdef ObjectArray properties Value end methods function obj = ObjectArray(F) if nargin ~= 0 m = size(F,1); n = size(F,2); p(m,n) = obj; for i = 1:m for j = 1:n p(i,j).Value = F(i,j); end end obj = p; end end end end
只要包含了无参数选项,此构造函数模式就既适用于值对象,也适用于句柄对象。