2017-05-15 10 views
0
#include <iostream> 
#include <string> 

class Data 
{ 
    private: 
    int day, month, year; 
    public: 
    Data() : Data(0,0,0) {}; 
    Data(int d, int m, int y) : day(d) , month(m), year(y) {} 
    void print() { std::cout << day << " " << month << " "<< year << std::endl; } 
}; 

int main() 
{ 
    Data a; 
    a.print(); //ok - output: 0,0,0 and no compiler errors 
} 

コンストラクタに戻り値がなく、オブジェクトが作成されたときにコンストラクタが呼び出されます。つまり、データを初期化できるため、別のコンストラクタからコンストラクタを呼び出すと完全に有効ですか?初期化リストに同じクラスの別のコンストラクタをコンストラクタで呼び出すことは有効ですか?

私はまた、Data() { Data(0,0,0); };ではないことに気づきました。は、現在のクラスデータメンバーを初期化します。

なぜData() : Data(0,0,0) {};が動作し、Data() { Data(0,0,0); };がそうでないのですか?

+3

[委任コンストラクタ](http://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructor)を参照してください。 2番目の例では、名前のついていないtempをスタックに作成して破棄します。それは建設とは関係がありません。 –

答えて

0

実行を行うのに最適な練習です:

Data() : Data(0,0,0) {}; 

あなたは単にあなたの初期化子リストを利用呼んでいます。

Data() { 
    Data(0,0,0); 
} 

理由は、あなたが行っているすべてが、すぐにデフォルトコンストラクタが完了すると破壊されるコンストラクタ内でスタック上に「匿名」Dataオブジェクトを作成しているので、何の仕事はありませんありません。

関連する問題