c++のオブジェクト初期化リスト

3097 ワード

1、オブジェクト初期化リストの出現原因(1).クラスメンバーが1つある場合は、それ自体がクラスまたは構造であり、このメンバーにはパラメータ付きのコンストラクション関数が1つしかなく、デフォルトのコンストラクション関数はありません.この場合、このクラスメンバーを初期化するには、このクラスメンバーのパラメータ付き構造関数を呼び出す必要があります.初期化リストがなければ、最初のステップを完了できず、エラーが発生します.
(2)、クラスメンバーにconst修飾がある場合は、オブジェクトを初期化するときにconst int mに値を割り当てなければなりません.クラスメンバーにconstオブジェクトが含まれている場合、または参照がある場合は、メンバー初期化リストで初期化する必要があります.この2つのオブジェクトは宣言後すぐに初期化され、コンストラクション関数では、彼らに値を割り当てるためです.これは許されない.
2、C++に初期化リストを提供してメンバー変数を初期化する文法規則Constructor::Contructor():m 1(v 1),m 2(v 1,v 2),m 3(v 3){//some other assignment operation}3、注意概念初期化:初期化されたオブジェクトは賦値を作成しています:賦値されたオブジェクトはすでに存在します
4、注意:メンバー変数の初期化順序は宣言された順序に関連し、初期化リストの順序に関係なく初期化リストが構造関数の関数体より先に実行される
5、コード
#include 

using namespace std;

class A
{
public:
    A(int a)
    {
        m_a = a;
        cout << "     A: " << a << endl;
    }

    ~A()
    {
        cout << "     A: " << m_a << endl;
    }
private:
    int m_a;
};


class B
{
public:
    //           ,               (          )
    // B    A    , A         ,         B      A   
    //                 

    // 1                  
    // 2                        ,                
    B(int a, int b): m_a1(a), m_a2(b), m_c(3)
    {
        m_a = a;
        m_b = b;
        cout << "     B: " << endl;
    }

    //                
    ~B()
    {
        cout << "     B: " << endl;
    }
private:
    int m_a;
    int m_b;
    const int m_c;  //        const        ,               
    //A m_a1;
    A m_a2;
    A m_a1; (                has)
};

int main()
{
    {
        //A a(1);
        B b(5,6);
    }

    return 0;
}