コンストラクション関数パラメータ初期化リスト

3125 ワード

クラスオブジェクトの作成時にコンストラクション関数が自動的に呼び出されます
コンストラクション関数は不要で手動で呼び出すことはできません
デフォルトのコンストラクション関数:オブジェクトを作成するときに実パラメータのコンストラクション関数を与える必要はありません.非パラメトリックコンストラクション関数とすべてのパラメータにデフォルト値があるコンストラクション関数が含まれます.
ユーザーがコンストラクション関数を定義していない場合、システムは自動的にデフォルトのコンストラクション関数を提供します.すなわち、上記のパラメトリックコンストラクション関数がなく、関数体が空です.
パラメータ初期化テーブルの必要性
クラス内のプライベート定数を定義する場合は、パラメータ初期化テーブルが関数体より先に実行され、定数は変更できないため、パラメータ初期化リストで定義する必要があります.
class Circle
{
    public:
        Circle():m_dPi(3.14){}
    private:
        const double m_dPi;
};

次のような書き方は許されません
    Circle(){m_dPi=3.14;}

デフォルトパラメータを使用したコンストラクション関数
コンストラクション関数を宣言するときにデフォルト値を指定しますが、コンストラクション関数を定義するときにのみデフォルト値を指定することはできません.コンストラクション関数の宣言はクラス定義にあるため、クラス定義はヘッダファイルに置かれ、クラスの対外インタフェースであり、コンストラクション関数の定義はクラスの実装の詳細であり、ユーザーは必ずしも見ることができない.この特徴は、ファイル分割で特に顕著です.
class Box{
    public:
        Box(int h=10,int w=20,int len =30);   
        //             
        /*
                      (      ),   
        Box(int =10,int =20,int=30);
        */
    private:
        int height;
        int weight;
        int length;
};
Box::Box(int h, int w, int len){    //                
        height=h;
        weight=w;
        length=len;
}

コピーコンストラクタ
定義形式:クラス名(constクラス名&変数名)
注意:一般的にconst宣言を追加し、この関数を呼び出すときに実パラメータオブジェクトを変更しないようにします.
インスタンス化されたオブジェクトを直接初期化または付与して初期化すると、コピーコンストラクション関数が自動的に呼び出されます.
明示的に定義されたコピーコンストラクタがない場合、デフォルトのコピーコンストラクタが自動的に生成されます.
class Student{
    public:
        Student(){m_strName="Jim";}
        /*
                 :
        Student(const Student &stu){}
        */
        Student(const Student &stu){m_strName=stu.m_strName}
        //           
    private:
        string m_strName;
};

int main()
{
    Student stu1;
    Student stu2=stu1;
    Student stu3(stu1);
    return 0;
}