2017-11-29 4 views
3
#include <iostream> 

using namespace std; 
class date{ 

    public: 
     int month; 
     int day; 
     int year; 

    private: 
     date(int x, int y, int z); 
    public: 
     date(int x, int y); 
}; 

date::date(int x, int y, int z): month{x}, day{y}, year{z} { 

    cout << "Hello you called me PRIVATE constructor" << endl; 

} 

date::date(int x, int y){ 
    cout << "Hello you called me PUBLIC constructor" << endl; 
    date(x, y, 100); 
} 


int main(){ 

    date x{11, 21}; 

    cout << x.month << endl; 
    cout << x.day << endl; 
    cout << x.year << endl; 

} 

を使用しながら、私は2つのコンストラクタを持ち、メインで私は2つの引数を持つオブジェクトxを作成します。C++ガベージメンバー値は、コード上で見ることができるようにパブリックとプライベートのオーバーロードされたコンストラクタ

これは、パブリックコンストラクタを呼び出して、プライベートコンストラクタを呼び出して、パブリックメンバーの月日と年を初期化する必要があります。

しかし、私がメンバーの価値を出すとき、私は望みの結果を得られません。出力に対し

Hello you called me PUBLIC constructor 
Hello you called me PRIVATE constructor 
392622664 
1 
0 

は次のようになります。

Hello you called me PUBLIC constructor 
Hello you called me PRIVATE constructor 
11 
21 
100 

私が何か間違ったことをしたところ、私は知りません。どんな助けもありがとう。ありがとうございました。

+5

'date(x、y、100);'あなたの考えをしません。ステートメントの終わりに破棄される新しい一時的な 'date'を作成します。文字列に加えて 'this'を' cout'で印刷した場合、気づいたでしょう。 –

答えて

8

コンストラクタを指定しているとは異なる順序で物事を呼び出すこと

は注意してください。式date(x, y, 100);は、プライベートコンストラクタを使用して一時インスタンスを作成します。プライベートコンストラクタはすぐに破棄されます。あなたはできます代理人の建設が適切なconstructor delegation syntaxを使用する必要があります。コンストラクタを委譲するには、初期化リストでコンストラクタを委譲する必要があります。これは、初期化リスト内の唯一の要素でなければなりません。例:

#include <iostream> 

using namespace std; 
class date { 

public: 
    int month; 
    int day; 
    int year; 

private: 
    date(int x, int y, int z); 
public: 
    date(int x, int y); 
}; 

date::date(int x, int y, int z) : month{ x }, day{ y }, year{ z } { 

    cout << "Hello you called me PRIVATE constructor" << endl; 

} 

date::date(int x, int y) : date(x, y, 100) { 
    cout << "Hello you called me PUBLIC constructor" << endl; 
} 


int main() { 

    date x{ 11, 21 }; 

    cout << x.month << endl; 
    cout << x.day << endl; 
    cout << x.year << endl; 
} 
+1

出力は '' Helloあなたは私にPRIVATEコンストラクタを呼び出し、その後に "PUBLICコンストラクタ"と呼んでいます(OPの予想される出力から逆順)。 – Jarod42

4

他の答えとして、コンストラクタを直接正常に呼び出すことはできません。しかし、他のコンストラクタ(C++ 11以降)から直接呼び出すこともできますが、構文は非常に限定的です。

date::date(int x, int y): 
     date(x, y, 100) 
{ 
    cout << "Hello you called me PUBLIC constructor" << endl; 
} 

つまり、イニシャライザリストの一部として呼び出す必要があります。これはあなたが何の名前を持っていないし、呼び出すことはできません

+0

コメントに反するのはなぜですか? – Slava

+0

コメントが削除されたため@Slava – UKMonkey

+0

@UKMonkeyこれは私のコメントです。他のコメントと重複していたので削除しました。コンストラクタは直接呼び出すことはできません。彼らは無名です。デリゲートの構築は、厳密にコンストラクタを呼び出すこととは区別され、それはそれがどのように見えるかと考えられます。 –

関連する問題