》对象数组
对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。
定义格式:
<类名><数组名>[<大小>].... 例:date dates[5];
使用对象数组成员的格式:
<数组名>[<下标>].<成员名> 例:dates[0].year
注:数组元素的更新有两种方式:
#用一个已知的对象进行更新
#直接生成一个新的对象进行更新
示 例:
dates[3]=date(5,25,2002);
等价于
date temp(5,25,2002); //建立一个匿名对象temp
dates[3]=temp;
释放temp;
这里隐含了三步操作:首先,以更新后的值作为参数生成一个匿名对象;其次,将匿名对象赋值给数组元素对象;最后,在赋值操作完成后,匿名对象的生存期结束,调用析构函数释放该匿名对象。
注:析构函数的执行顺序与构造函数的执行顺序相反。
》成员对象
类的数据成员可以是简单类型或自定义类型的变量,也可以是类类型的对象。因此,可以利用已定义的类来构成新的类,使得一些复杂的类可以由一些简单类组合而成。类的聚集描述的就是一个类使用其他类的对象作为成员的情况。
当一个类的成员是另外一个类的对象时,该对象就称为成员对象。当类中出现了成员对象时,该类的构造函数要包含对成员对象的初始化,成员对象的初始化工作也是在成员初始化列表中完成的。
初始化的一般格式:
<类名>::<类名>(<总形参表>):<成员对象1>(<形参表1>),<成员对象2>(<形参表2>),...
{
......
}
建立一个类的对象时,要调用它的构造函数对类对象初始化,此时应先执行初始化列表对各个成员进行初始化,再执行当前类的构造函数体。如果类中包含有成员对象,注意要根据初始化的参数调用成员对象的构造函数对其进行初始化。析构函数的执行顺序与构造函数的执行顺序相反。
在对成员对象初始化时,根据初始化列表的特点可知:类中有多个成员对象时,要按照定义成员对象的顺序建立各个子对象,即成员对象构造函数的执行顺序仅与成员对象在类中声明的顺序有关,而与成员初始化列表中给出的成员对象的顺序无关。如果在构造函数的成员初始化列表中没有给出对成员对象的初始化,则表示使用成员对象的默认构造函数。如果成员对象所在的类没有默认构造函数,将产生错误。
示 例:
#include<iostream>
using namespace std;
class counter
{
public:
counter():val(0){cout<<"Default constructor of counter"<<endl; }
counter(int x):val(x){cout<<"Constructor of counter:"<<val<<endl; }
~counter(){cout<<"Destructor of counter:"<<val<<endl; }
private:
int val;
};
class example
{
public:
example():val(0){cout<<"Default constructor of example"<<endl; }
example(int x):c2(x),val(x){cout<<"Constructor of example:"<<val<<endl; }
~example(){cout<<"Destructor of example:"<<val<<endl; }
void print()const{cout<<"value="<<val<<endl; }
private:
counter c1,c2;
int val;
};
int main(){
example e1,e2(4);
e2.print();
system("pause");
return 0;
}
程序运行结果:
由于软件原因析构函数无法截图:
Destructor of example:4
Destructor of counter:4
Destructor of counter:0
Destructor of example:0
Destructor of counter:0
Destructor of counter:0
类example中存在counter类的成员对象从c1,c2.建立example类的对象时,要先对成员对象c1,c2以及成员val进行初始化。这些成员对象的初始化在类example的构造函数的初始化列表中进行,成员初始化工作完成后,在执行example的构造函数体。
在建立example类的对象e1时,由于没有提供参数,因此应调用example类的默认构造函数。example类的默认构造函数的初始化列表为空,表示对全部三个数据成员进行默认初始化,其中调用了成员对象c1,c2的默认构造函数,因此输出Default constructor of counter;Default constructor of counter;Default constructor of example。在建立e2对象时,对成员对象c1的初始化也使用了默认构造函数。
由于类example中同时存在两个成员对象,因此应该按照声明成员对象的顺序对这两个成员对象进行初始化,即应先对成员对象c1进行初始化,在对成员对象c2进行初始化。
在主程序结束时,要调用两个对象e1,e2的析构函数。析构函数的执行顺序与构造函数的执行顺序相反,即先析构e2对象,在析构e1对象。e2对象中包含有成员对象,它必须负责成员对象c1,c2的析构,析构顺序也与建立e2对象时的顺序相反,即先析构e2对象,在析构成员对象c2,最后析构成员对象c1。e1的析构过程与此相同。