成员对象和封闭类

成员对象和封闭类

有成员对象的类叫封闭类

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 tw)::price(p), tyre(tr, w) {}

int main()
{
    CCar car(20000, 17, 225);

    return 0;
}
/*
上例中,如果CCar类不定义构造函数,则“CCar car;”这条语句编译会出错。(原因:编译器不知道car.tyre该如何初始化。car.engine可用默认构造函数初始化)
任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象是如何初始化的。(具体做法:通过封闭类的构造函数的初始化列表)
成员对象初始化列表中的参数可以是任意复杂的表达式(包括函数、变量,只要表达式中的函数或者变量有定义就行)
*/

封闭类构造函数和析构函数的执行顺序

1、封闭类对象生成时,先执行所有对象成员的构造函数,然后才执行封闭类的构造函数。
2、对象成员的构造函数调用次序和对象成员在类中的说明次序一致,与它们在成员初始化列表中出现的次序无关。
3、当封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。次序和构造函数的调用次序相反。

//封闭类实例:
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 contructor
CTyre contructor
CCar contructor
CCar destructor
CTyre destructor
CEngine destructor
*/

封闭类的复制构造函数

class A
{
public:
    A()
    {
        cout << "default" << endl;
    }
    A(A &a)
    {
        cout << "copy" << endl;
    }
};

class B
{
    A a;
};

int main()
{
    B b1, b2(b1);  //b2.a是用类A的复制构造函数初始化的。而且调用复制构造函数的实参就是b1.a

    return 0;
}
/*
default
copy
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值