对象数组的定义与初始化(构造)-解决对象数组不能逐一初始化-对象数组的赋值具有局限性等深层高级问题
创建对象数组过程如创建整数数组一样
如下所示:
Int array[8];
Array[0]=;array[1]=;
……
在定义数组之后!(注意前提条件)
你只能对数组成员进行赋值,不能初始化,因为数组成员在定义时一定初始化。
只不过相比于显式的初始化(例如int b[] ={1,3,5}),还存在一种隐式自动初始化,看下面资料。
资料如下
数组如果没有显示地初始化,即在定义数组的时候,就给它们赋值。那么,定义出来的数组满足以下三点规则(隐式初始化):
1. 定义在函数体外的数组,并且数组类型是内置类型,那么数组自动初始化为0.
2. 定义在函数体内的数组,并且数组类型是内置类型,那么数组没有被初始化,这也是导致bug的一个来源。
3. 不管数组在哪里定义,只要数组类型是一个自定义类,那么数组就会被默认构造函数初始化。
看完回来。
所以一旦定义后,就不可能再初始化,因为已经默认初始化。
同理,对象数组中的默认初始化,参数初始化通通不能用。
所以
对象数组的创建有两种方式
通常做法是:创建一个类成员函数set函数,该函数对各成员赋值,(对于类成员,引用,常量这些只能初始化不能赋值的特殊情况 后面做详细讨论。)创建对象数组最普通的方法,该举例在文章末尾请跳转。
奇葩做法:定义对象数组同时初始化,类比(int b[] ={1,3,5})。
比较优缺点:通常做法适合 循环输入。
进阶问题:
那如果针对类成员,引用,常量特殊情况,怎么办?
既要数组,又要构造(初始化)。
方法1:
可以在默认构造函数进行他们的初始化,但是只能初始化事先确定的值而且所有对象都是这一个值,不能初始化你想输入的值也不能每个对象具有不同的值。所以太局限了。
方法2:
我称之为构造拷贝法。
Class base{};
…….
base* pf = new base[3];
for(int i=0;i<3;i++)
{
cin >> a >> b;
pf[i]=base (a,b);
}
也就是通过逐一外界输入参数进行构造函数调用,初始化后的对象拷贝给对象数组的成员。
其实方法2依旧无法解决 特殊成员的构造问题,因为类成员,引用,常量不能赋值继而也不能拷贝构造。
方法1虽然可以但充满局限。
以上算是给大家提供了一种思路吧。
欢迎提供方法3.