C++ 中的成员对象(学习笔记)

 

 

 【概念】

成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。概括的说,就是一个类的成员是一个对象,即成员对象。

例如:

#include<iostream>
using namespace std;

class Date{  ...};  //创建一个对象Date,类体略

class Time
{ Date d1 , d2;};  //创建一个对象Time,该对象有两个数据成员d1和d2,这两个成员是Date类的两个对象

在这个例子中,Time的成员d1和d2是Date的对象,那么d1和d2就是成员对象。

【要求】

1、出现成员对象时,该类的构造函数要包含对成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的缺省构造函数。

 如上例中的Time中,有两个成员对象d1和d2,那么在Time类的构造函数中,就应该包含对d1和d2的初始化,这个初始化通常采用成员初始化列表的方式进行。

构造函数对成员对象初始化列表的格式为:

<类名>::<类名>(<总参数表>):<成员对象1>(<形参表1>), <成员对象2>(<形参表2>),……

{ //函数体 }

如上例的Time类的构造函数可以这样定义:
<Time>::<Time>(int m):d1(m),d2(5);    //如果在类体内定义,则省略<Time>::
   {   ...    }

该例中d1被初始化为d1(m),d2被初始化为d2(5).

再如:
<Time>::<Time>(int m):d1(m)     //如果在类体内定义,则省略<Time>::
   {   ...    }

该例中d1被初始化为d1(m),d2未被初始化.

2、建立一个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数。

如上例修改如下:

#include<iostream>
using namespace std;

class Date

 public:
 Date( ){ cout<<"This is Date"<<endl; }      //Date的缺省构造函数
 Date(int A) { cout<<"The value="<<A<<endl; };
 
class Time
 {  
   public:
    Time( ) {cout<<"This is Time"<<endl;  //Time的缺省构造函数
    Time(int A):d2( A )   //Time的构造函数。采用成员初始化列表的方式,成员对象d1的形参未初始化
   ,将成员对象d2的形参初始化为A
   {
        cout<<"Hello!"<<endl;
   }

   private:
   Date d1 , d2;        //在Time中声明两个数据成员d1和d2,这两个成员是Date类的两个对象,即d1和d2是成员对象
};

 void main( )
  {
     Time t1, t2(6);   //注释1
     cout<<"The end"<<endl;
  }

注释1:

主程序运行到Time t1 , t2时,会检查Time类中是否有成员对象,检查中根据Date d1 , d2;  发现有成员对象d1和d2,就先执行d1和d2对应的Date类中的构造函数,然后再执行Time中的构造函数。
具体步骤为:

(一)在创建t1对象(无参数)时,按下列步骤进行:
1、执行d1所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date;
2、执行d2所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date;
3、执行t1所属类Time的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is time;

(二)在创建t2对象(有参数)时,按下列步骤进行:
4、执行d1所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date.
5、执行d2所属类Date的构造函数,根据Time中 Time(int A):d2(A); 发现d2已经被初始化为d2(A),在这里即为d2(6),由此则需要调用Date类的构造函数Date(int A),输出 The value= .
6、执行t2所属类Time的构造函数,t2的重载函数应为Time(int A),输出 Hello.


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电脑小玩家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值