成员对象和封闭类

基本概念

成员对象:一个类的成员变量是另一个类的对象
封闭类:包含成员对象的类叫封闭类(Enclosing)

class CTyre{
private:
    int radius;
    int width;
public:
    CTyre(int r,int w):radius(r),width(w){}
};
class CEngine{
};
class CCar{
private:
    int price;
    CTyre tyre;
    CEngine engine;
public:
    CCar(int p,int tr,int tw);
};
CCar::CCar(int p,int tr,int w):price(p),tyre(tr,w){
};
int main(){
    CCar car(20000,17,225);
    return 0;
}

如果CCar类不定义构造函数,则
CCar car;// 编译出错
因为编译器不知道car.tyre如何初始化,car.engine初始化没有问题,用默认构造函数
生成封闭类对象的语句,要明确“对象中的成员对象”如何初始化

封闭类构造函数的初始化列表

定义封闭类构造函数时,添加初始化列表:
类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表), …
{
……
}
成员对象初始化列表中的参数:任意复杂的表达式;函数/变量/表达式中的函数,变量有定义

调用顺序

当封闭类对象生成时:
1)先执行所有成员对象的构造函数
2)再执行封闭类的构造函数

成员对象的构造函数调用顺序:
1)和成员对象在类中的说明顺序一致
2)与在成员初始化列表中出现的顺序无关

当封闭类的对象消亡时:
1)先执行封闭类的析构函数
2)再执行成员对象的析构函数

析构函数顺序和构造函数的调用顺序相反

class CTyre{
public:
    CTyre(){cout<<"CTyre contructor"<<endl;}
    ~CTyre(){cout<<"CTyre destructor"<<endl;}
};
class CEngine{
public:
    CEngine(){cout<<"CEngine contructor"<<endl;}
    ~CEngine(){cout<<"CEngine destructor"<<endl;}
};
class CCar{
private:
    CEngine engine;
    CTyre tyre;
public:
    CCar(){cout<<"CCar contructor"<<endl;}
    ~CCar(){cout<<"CCar destructor"<<endl;}
};

int main(){
    CCar car;
    return 0;
}

程序输出结果:
CEngine constructor
CTyre constructor
CCar constructor
CCar destructor
CTyre destructor
CEngine destructor

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值