• 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

  • 相关阅读:
    js实现element中可清空的输入框(1)
    vue中v-model的学习
    Oracle触发器和MySQL触发器的简单应用
    Java中的多线程你只要看这一篇就够了()
    HTML 随笔记之 刷新页面
    HTML CSS 随笔记之 cursor
    float到底是干什么的?
    Spring Boot 事物的快速应用
    java web 中文乱码
    LVM 创建实例
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12261992.html
Copyright © 2020-2023  润新知