• c++,初始化列表


    类对象的构造顺序是这样的:
      a.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
      b.进入构造函数后在构造函数中执行一般计算

    1.初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。使用初始化列表主要是基于性能问题.  [参考C++ 初始化列表 http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html。]

      对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?由上面的测试可知,使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。

    2. 除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表

    • 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
    • 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
    • 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化。
      •   如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。
      •   经过试验发现,对于继承的类来说,如果父类没有默认的构造函数,则必须在子类的构造函数中以初始化列表的方式区初始化父类成员,否则报错。

     基类:

     class Time { public: Time(int h , int m=0, int s=0) { cout<<"A construct"<<endl; hour = h; min = m; sec = s; } void show_time() { cout<<hour<<":"<<min<<":"<<sec<<endl; } int gethour() { return hour; } int getmin() { return min; } int getsec() { return sec; } protected: int hour; int min ; int sec; };

    子类,构造函数声明:

    DTime(int h, int m, int s); DTime(Time &t);

     

    class DTime: public Time { public: DTime(int h, int m, int s); DTime(Time &t); void show_time() { cout<<date<<"-"<<hour<<":"<<min<<":"<<sec<<endl; } void setdate(int d) { date = d; } private: int date; };

    定义构造函数时使用初始化列表:

    冒号以后跟以逗号隔开的成员初始化列表

    基类初始化时注意,基类中必须要定义有相应形式的构造函数,否则报错。

    错误示例:
    DTime::DTime(Time &t)
      :date(2014)//error C2512: “Time”: 没有合适的默认构造函数可用

    //若基类中没有默认构造函数,初始化列表中必须以自定义的基类构造函数来初始化基类成员。
    {

    }

    正确示例:

    DTime::DTime(int h, int m, int s)//此处同声明一致 :Time(h,m,s)//基类初始化 ,date(2014)//成员变量初始化
    {
    }

    DTime::DTime(Time &t)//此处同声明一致

    :Time(t.gethour(), t.getmin(),t.getsec()) //基类初始化
    ,date(2014) //成员初始化
    {
    }

     DTime::DTime(int h, int m, int s) :Time(h,m,s) ,date(2014) { } DTime::DTime(Time &t) :Time(t.gethour(), t.getmin(),t.getsec()) ,date(2014) { }

      

    使用:

     int _tmain(int argc, _TCHAR* argv[]) { Time time(1); time.show_time(); Time& t = time; DTime dtime(t);//此处同声明一致 dtime.show_time(); DTime d_time(12,24,25);//此处同声明一致 d_time.show_time(); system("pause"); return 0; } /* A construct 1:0:0 A construct 2014-1:0:0 A construct 2014-12:24:25 请按任意键继续. . . */

    参考:

    1. C++ 与“类”有关的注意事项总结(十一): 成员初始化列表(★) http://www.cnblogs.com/charley_yang/archive/2011/04/07/2007356.html

    2. C++ 初始化列表  http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html

  • 相关阅读:
    Cmake、ROS中的Catkin、Makefile是什么?相互之间有什么关系
    Controller层
    mysql操作
    各种技术实现
    mysql报错
    重点网站
    python操作json文件的四种常用方法
    Python从无到有搭建接口(API)自动化测试框架
    Python的五大自动化测试架构
    Python 测试框架unittest和pytest的优劣
  • 原文地址:https://www.cnblogs.com/mylinux/p/4726873.html
Copyright © 2020-2023  润新知