其实吧,在C++程序中,还是复杂的对象比较多,这篇就开始逐渐梳理一下复杂的类对象。
一个对象作为另一个类的成员时,该对象称为类的子对象。子对象实际上是用对象作为某类的数据成员。
比如:
<span style="font-size:18px;">class A
{
};
class B
{
private:
A a;//给出的私有数据成员是类A的对象
};</span>
当一个类中出现了对象成员时,该类的构造函数就要包含对子对象的初始化,于是构造函数中就应包含数据成员初始化列表,用来对子对象进行初始化。
还是举一个例子来说明子对象:
<span style="font-size:18px;">#include <iostream>
using namespace std;
class A//定义的类A
{
public:
A(int i,int j)//类A的带两个参数的构造函数
{ m1=i;m2=j; }
void Print()//一般成员函数
{
cout<<m1<<","<<m2<<endl;
}
private://两个私有数据成,只能被成员函数和友元函数访问
int m1,m2;
};
class B//定义的类B
{
public:
B(int i,int j,int k):a(i,j)//类B的带三个参数的构造函数,并且对子对象进行了初始化
{
b=k;//对其他的私有数据成员进行初始化
}
void Print()
{
a.Print();//通过对象a调用类A的构造函数
cout<<b<<endl;
}
private:
A a;//私有数据成员为类A的对象a,叫做子对象
int b;
};
int main()
{
A a1(3,9);//定义的类A的对象
a1.Print();//通过对象调用成员函数
B b1(10,20,30);//定义的类B的对象
b1.Print();
return 0;
}</span>
程序分析:
1,因为类B中包含了子对象,因此类B的构造函数包含了数据成员初始化列表,即B(int i,int j,int k):a(i,j)。
2,成员初始化列表放在构造函数的后边,并用冒号进行分隔,成员初始化列表是由一个或多个选项组成的,多个选项之间用逗号分隔,成员初始化列表中的选项可以用于对子对象进行初始化,也可以用于对该类其他成员进行初始化。选项的格式由数据成员名和括号内该成员进行初始化的参数组成,该参数是构造函数总参数的一部分。
3,该题中的
B(int i,int j,int k):a(i,j)//类B的带三个参数的构造函数,并且对子对象进行了初始化
{
b=k;//对其他的私有数据成员进行初始化
}
也可以写成B(int i,int j,int k):a(i,j),b(k) {}
再来3种错误的情况:
错误类型1: B(int i,int j,int k)//类B的带三个参数的构造函数,并且对子对象进行了初始化
{
a(i,j);
b=k;
}
错误类型2:B(int i,int j,int k)//类B的带三个参数的构造函数,并且对子对象进行了初始化
{
a.m1=i;
a.m2=j;
b=k;
}
错误类型3:B(int i,int j,int k):m1=i,m2=j//类B的带三个参数的构造函数,并且对子对象进行了初始化
{
b=k;
}
因此在编程规范的程序时要有良好的编程风格。