C++复杂对象之子对象

时间:2022-05-30 14:12:05

        其实吧,在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;
                           }

        因此在编程规范的程序时要有良好的编程风格。