Tutorial . Constructors

Constructors
constructorとはclassごとに定義されたオブジェクト生成時の処理です。

class_id parameters constructor_list {}

このような形式で定義され、class_idはclassのidentifierと等しくなければなりません。
constructor_listは:から始まり、base classのコンストラクタを呼ぶ場合や、memberの宣言を明示的に行う場合に定義します。constructor_listは必ずしも定義する必要はありません。

class pair2{
    int first, second;

    pair2(int x, int y) : first(x){
        second=y;
    }
};


class pair2はpair2(int x, int y)のconstructorを定義しています。この場合、firstはオブジェクトの生成の際に明示的にconstructorが呼ばれ、xで初期化されます。secondに対してはyの代入が行われます。

pair2 p5(10,5);

生成されたp5はそれぞれp5.firstが10、p5.secondが5という値を持つことが期待されます。

Default Constructors
default constructorはparameterを渡されずにオブジェクトが生成される場合に呼ばれる処理です。全てのclassはdefault constructorが定義されています。また、明示的にdefault constructorを定義することも可能です。

class pair1{
    int first, second;
};


class pair1はdefault constructorを明示的に定義していません。明示的に定義されていないdefault constructorは何も行いません。

pair1 p1;

p1は初期化されずにオブジェクトの生成が行われるのでdefault constructorが呼ばれます。この時に期待されるp1.firstの値は0であり、p1.secondの値は0となります。

class pair2{
    pair2(){
        first=1;
        second=2;
    }
};


class pair2はdefault constructorを明示的に定義しています。

pair2 p3;

この例ではそれぞれp3.firstが1、p3.secondが2の値となることが期待されます。

Copy Constructors
copy constructorはparameterに同一データ型のオブジェクトが渡された場合に呼ばれる処理です。全てのclassはcopy constructorが定義されています。また、明示的にcopy constructorを定義することも可能です。

class pair1{
    int first, second;
};


class pair1はcopy constructorを明示的に定義していません。明示的に定義されていないcopy constructorはshallow copyを行います。つまり、新たに生成されるオブジェクトは初期化されるオブジェクトと同じ値となります。

pair1 p2(p1);


このような宣言が行われた場合、p2のp2.firstはp1.firstと等しく、p2.secondはp1.secondと等しい値を持つことになります。

class pair2{
    pair2(pair2& p){
        first=p.second;
        second=p.first;
    }
}

copy constructorを明示的に定義する場合、parameter sizeは1でデータ型として必ずそのclassのreferenceを指定しなければなりません。
class pair2はcopy constructorを明示的に定義しています。ここでは渡されたオブジェクトのfirstとsecondの値をそれぞれsecondとfirstへ代入しています。

pair2 p4(p3);


このようにp4が宣言された場合、p4.firstはp3.second、p4.secondはp3.firstと等しい値を持つことが期待されます。

Constructors for Reference Members
referenceなmemberは、必ずconstructor_listで初期化されなければなりません。

class pair3{
    int& first, &second;
    pair3(pair1& p) : first(p.first), second(p.second){}
};


class pair3はfirst、secondというreferenceなmemberを持っています。これらの変数は暗黙的に定義されているcopy constructorを除く全てのconstructorにおいてconstructor_listで初期化されなければなりません。

//pair3 p7;

この場合p7は暗黙的に定義されているdefault constructorではreferenceなmemberは初期化されないので、オブジェクトを生成することが出来ません。

pair3 p6(p2);


この場合p6はp2によって初期化されます。p6.firstはp2.firstのreferenceとなり、p6.secondはp2.secondのreferenceになることが期待されます。

pair3 p8(p6);

暗黙的に定義されているcopy constructorはreferenceをコピーすることが出来るので、この宣言は合法となります。


Next: Tutorial 14. Inheritance
Prev: Tutorial 12. References