美文网首页C++基础知识
C++ 成员对象和封闭类

C++ 成员对象和封闭类

作者: 小林coding | 来源:发表于2019-11-28 23:49 被阅读0次

    01 成员对象与封闭类

    类里有其他对象则该对象叫成员对象;有成员对象的类叫 封闭类

    class CTyre  // 轮胎类
    {
    public:
        // 有参数构造函数
        // 初始化成员变量m_radius和m_width
        CTyre(int r, int w):m_radius(r),m_width(w) { }
    private:
        int m_radius; // 半径
        int m_width;  // 宽度
    };
    
    class CEngine // 引擎类
    {
        // 默认会有无参数构造函数
    };
    
    class CCar // 汽车类 -- 封闭类
    {
    public:
        // 有参数构造函数
        // 对成员变量m_price初始化,对成员对象tyre初始化
        CCar(int p, int tr, int tw):m_price(p),tyre(tr,tw){} 
    private:
        int m_price;    // 价格
        CTyre tyre;     // 成员对象
        CEngine engine; // 成员对象
    };
    
    int main()
    {
        CCar car(10000,20,50);
        return 0;
    }
    

    上例中,如果CCar类不定义构造函数,则会使用默认的无参构造函数,那么下面的语句会编译出错:

    CCar car;
    

    因为编译器不明白CCar类中的tyre成员对象该如何初始化。engine成员对象的初始化则没问题呢,因为用默认构造函数即可。

    任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。

    具体的做法是:通过封闭类的构造函数的初始化列表


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

    • 封闭类对象生成时,先执行所有成员对象的构造函数,然后才执行封闭类的构造函数。
    • 成员对象的构造函数执行顺序,与在封闭类定义成员对象的顺序一致。
    • 当封闭类的对象消忙时,只需要记住一句话:先构造的对象,后析构,由于封闭类是最后才被构造的,所以封闭类对象最先析构。
    class CTyre // 轮胎类
    {
    public:
        CTyre(){ std::cout << "CTyre 构造函数" << std::endl; }
        ~CTyre(){ std::cout << "CTyre 析构函数" << std::endl; }
    };
    
    class CEngine // 引擎类
    {
    public:
        CEngine(){ std::cout << "CEngine 构造函数" << std::endl; }
        ~CEngine(){ std::cout << "CEngine 析构函数" << std::endl; }
    };
    
    class CCar // 汽车类 -- 3. 最后构造封闭类对象
    {
    public:
        CCar(){ std::cout << "CCar 构造函数" << std::endl; }
        ~CCar(){ std::cout << "CCar 析构函数" << std::endl; }
    private:
        CTyre tyre;     // 1. 先构构造该成员对象
        CEngine engine; // 2. 接着构造该成员对象
    };
    
    int main()
    {
        CCar car;
        return 0;
    }
    

    执行结果:

    CTyre 构造函数
    CEngine 构造函数
    CCar 构造函数
    CCar 析构函数
    CEngine 析构函数
    CTyre 析构函数
    

    03 封闭类的复制构造函数

    class A
    {
    public:
        // 无参数构造函数
        A() { std::cout << "A 构造函数" << std::endl; }
        // 复制构造函数
        A(A & a) { std::cout << "A 复制构造函数" << std::endl; }
    };
    
    class B
    {
        // 若没有声明构造函数和复制构造函数,则编译器会默认生成构造函数和复制构造函数
        
        A a; // 成员对象
    };
    
    int main()
    {
        B b1; // b1对象 和 成员对象a都会执行无参数的构造函数
        B b2(b1); // b2对象 和 成员对象a都会执行复制构造函数
        return 0;
    }
    

    输出结果:

    A 构造函数
    A 复制构造函数
    

    相关文章

      网友评论

        本文标题:C++ 成员对象和封闭类

        本文链接:https://www.haomeiwen.com/subject/tbtwwctx.html