当一个类的成员是某一个类的对象时,该对象就为子对象。子对象实际就是对象成员。
例如:
class
A
{ ……. }
class B
{ public : …….
private : A a;……… };
{ ……. }
class B
{ public : …….
private : A a;……… };
其中, a是子对象,它是A类的对象作为B类的成员。
在类中出现了子对象或对象成员时,该类的构造函数要包含对子对象的初始化,通常采用成员初始化列表的方法来初始化子对象。在成员初始化表中包含对子对象的初始化和对类中其他成员的初始化。
#include <iostream>
using namespace std;
class A
{
public :
A(void ){
cout<<"A constructor is called!"<< endl;
}
};
class B
{
public :
B (void ){
cout<<"B constructor is called!"<< endl;
}
private :
static B* p_myself;
public :
static B* instance()
{
if(p_myself== NULL)
{
p_myself=new B();
}
return p_myself;
}
private :
A a;//a为子对象
};
B* B::p_myself= NULL;
int main()
{
B* bb;
bb= B::instance();
return 0 ;
}
using namespace std;
class A
{
public :
A(void ){
cout<<"A constructor is called!"<< endl;
}
};
class B
{
public :
B (void ){
cout<<"B constructor is called!"<< endl;
}
private :
static B* p_myself;
public :
static B* instance()
{
if(p_myself== NULL)
{
p_myself=new B();
}
return p_myself;
}
private :
A a;//a为子对象
};
B* B::p_myself= NULL;
int main()
{
B* bb;
bb= B::instance();
return 0 ;
}
输出结果:
A constructor is called!
B constructor is called!
B constructor is called!
若将 A a; 改为A* a;(即定义一个指向A类对象的指针),则在初始化B时,不会初始化A。即输出结果为:
B constructor is called!