c++学习笔记(八)

成员对象和封闭类

  • 有成员对象的类称为封闭类
  • 成员对象<=>成员中有其他类的对象
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该如何初始化,CTyre内部的构造函数是需要参数的,你没给,所以编译出错
  • 但是car.engine的初始化没有问题,他使用默认的无参构造函数
  • 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象是如何初始化的
  • 成员对象的初始化列表中的参数可以是任意复杂的表达式,可以包括函数,变量,只要表达式中的函数或变量有意义就行

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

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

封闭类的复制构造函数

class A
{
    public:
        A(){cout<<"default"<<endl;}
        A(A&a){cout<<"copy"<endl;}
};
class B{A a;};
int main()
{
    B b1,b2(b2);
    return 0;
}
  • 输出
default
copy

说明b2.a是用类A的复制构造函数初始化的,而且调用复制构造函数时的实参就是b1.a

posted on 2020-02-04 23:17  2002ljy  阅读(103)  评论(0编辑  收藏  举报

导航

Live2D