zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POWERDESIGNER中显示样式设置
    DatagridView 最后编辑状态数据无法自动提交的问题
    oracle 10G以上版本 树形查询新加的几个功能
    net farmework 4安装不了 原因是 HRESULT 0xc8000222
    npoi 导出
    oracle rowtype
    fiddler https
    一次linux站点安装经验
    小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
    日志系统
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12261992.html
Copyright © 2011-2022 走看看