• C++:初始化列表


    有两种原因需要使用初始化列表:

    让我们先看一下第一个原因——必要性。(1)对另一个类成员的初始化,(2)成员是一个常量对象,(3)成员是引用。根本原因:编译器总是确保所有成员对象在构造函数体执行之前(初始化列表之后)被初始化

    变量的初始化顺序就应该是:

    1 基类的静态变量或全局变量

    2 派生类的静态变量或全局变量

    3 基类的成员变量

    4 派生类的成员变量

    注意:

    1. 成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。

    2. 如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
    3. 类中const成员常量必须在构造函数初始化列表中初始化。
    4. 类中static成员变量,必须在类外初始化。 

    变量的析构函数顺序:子类析构->父类析构。

    使用初始化列表的第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。假定你有 一个类CMyClass具有一个CString类型的成员m_str,你想把它初始化为"Hi,how are you."。你有两种选择:

    CMyClass::CMyClass() {CString::operator=(LPCTSTR);m_str = _T("Hi,how are you.");} 

    CString::CString(LPCTSTR)CMyClass::CMyClass() : m_str(_T("Hi,how are you.")){}    

    在它们之间有什么不同吗?是的。编译器总是确保所有成员对象在构造函数体执行之前被初始化,因此在第一个例子中编译的代码将调用 CString::CString来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString:: CString(LPCTSTR)的调用并将"Hi,how are you."传递给这个函数。结果是在第一个例子中调用了两个CString函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。

    在内建类型如int或者long或者其它没有构造函数的类型下,在初始化列表和在构造函数体内赋值这两种方法没有性能上的差别。不管用那一种方法,都只会有一次赋值发生。

  • 相关阅读:
    JSP——隐式对象(implicit object)
    Spring——原理解析利用反射和注解模拟IoC的自动装配
    Spring操作指南针对JDBC配置声明式事务管理(基于注解)
    SpringMVC操作指南登录功能与请求过滤
    Spring操作指南针对JDBC配置声明式事务管理(基于XML)
    Flex Tree 限制只能同级拖动 获得拖动前后节点信息
    坐标系、坐标参照系、坐标变换、投影变换【转】
    国内地图偏移的一些知识
    Web Mercator
    WKT【转】
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4827853.html
Copyright © 2020-2023  润新知