zoukankan      html  css  js  c++  java
  • 为什么需要初始化列表

    /****************************************************
    # File        : main.cpp
    # Author      : lucasysfeng
    # Revision    : 2014-10-13 17:04:43
    # Description :
    ****************************************************/
    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        A() { cout << "A constructor" << endl;  }
        ~A() { cout << "A destructor" << endl; }
        A(const A&) { cout << "A copy" << endl; }
        A& operator=(const A) { cout << "A assign" << endl; return *this; }
    };
    
    class B
    {
    public:
        B() { cout << "B constructor" << endl;  }
        // B(const A a) { _a = a; cout << "B constructor with arg" << endl;  }
        B(const A a) : _a(a) { cout << "B constructor with arg" << endl;  }
        ~B() { cout << "B destructor" << endl; }
        B(const B&) { cout << "B copy" << endl; }
        B& operator=(const B) { cout << "B assign" << endl; return *this;}
    private:
        A _a;
    };
    
    int main(int argc, char** argv)
    {
        A a;
        B b(a);
    
        return 0;
    }
    

      

    一般构造函数可以对数据成员赋值,那为什么需要初始化列表

    举一个例子就可反证,有的数据成员并不能通过赋值进行初始化,因此初始化列表是必要的。

    Effective C++

    1.有些情况下必须用初始化——特别是const和引用数据成员只能用初始化,不能被赋值。

    2.成员初始化列表的效率比赋值的效率高。

    (在构造函数实现中赋值,需要调用构造函数和赋值构造函数;而用成员初始化列表只需

    调用拷贝构造函数。)

    下面程序错误:
    #include <iostream>
    using namespace std;
    
    class Test {
    private:
    	const int a;
    public:
    	Test() {a = 0;}  //error,不能对const数据成员初始化。
    };
    
    int main()
    {
    	return 0;
    }
    
    
    
    

    下面程序正确:

    #include <iostream>
    
    using namespace std;
    
    class Test {
    private:
    	const int a;
    public:
    	Test(): a(0) {}
    };
    
    int main()
    {
    	return 0;
    }
    
    
    
    
  • 相关阅读:
    Android的依赖注入框架:Dagger
    Android第三方开发组件
    Android 应用市场链接上传地址
    Android 开源框架以及开源项目以及连接
    Android 左右侧滑
    Android Textview 跑马灯
    Android XMPP推送
    Android多分辨率设配方案
    Android特效UI
    Android 时间的转换
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2830205.html
Copyright © 2011-2022 走看看