-2

クラスで変数を宣言し、次にそれらの変数の値を割り当てるとき、たとえば次のように

class c {

    public :

    int x;
    int x2;

    c () {
        x = 0;
        x2 = 0;

        scanf ("%d", &x); and now we're gonna input for example 10
    } 
};

クラスが使用されるたびに、つまり、コンストラクターが呼び出されるたびに、コンストラクターでゼロとして初期化されるため、xの値は再び0になります。ただし、値を初期化しないと、エラーが発生します。

私の質問は、コンストラクターを何度も呼び出すときに変数の値を保持して、ゼロにならないようにするにはどうすればよいかということです。

編集:

void example () {

int i;
scanf ("%d", &i); 
switch (i) {
case 1 : {Object ob1; system ("cls"); menu ();} // this object contains a value like 20 
case 2 : {Object ob2; system ("cls"); menu ();} 
}  

}

オブジェクト1には、メインメニューに戻るオプションを含む別のスイッチケースがあります。ここで、もう一度1を入力すると、オブジェクト1に戻ります。値20が表示されないため、0になります。

4

3 に答える 3

1

コンストラクターはインスタンスごとに1回だけ呼び出されるため、それについて心配する必要があります。コンストラクターがあるため、特定のインスタンスのxの値を0にリセットすることはありません。

于 2013-01-12T10:53:54.240 に答える
0

静的変数に格納できます。次に、その静的変数からxの値を読み取ります。

于 2013-01-12T10:53:32.127 に答える
0

クラスとオブジェクト/インスタンスの違いを理解していますか?クラスは、オブジェクトの単なる「Cookieカッター」です。コンストラクター自体を「呼び出す」ことはありませんが、クラスのインスタンスを作成します(暗黙的にコンストラクターを呼び出します)。

c myObj; 
c anotherObj; 

このコードは、クラスcの2つのインスタンスを作成し、両方とも独自のバージョンのx1とx2を使用します。コンストラクターは、作成時に2回目に実行されるのは事実ですが、anotherObjまったく異なるメモリで動作します。したがって、のx1とx2の値は変更されmyObjません。

編集:クラスメンバー関数のポイントは、thisという名前の暗黙の追加パラメーターを操作することです。「コンストラクター呼び出し」は実際にはそのように見えると想像できます(説明のためだけに、有効なコードを意味するものではありません)。

c* this = malloc(sizeof(c));
constructor(c);
// With "constructor" actually being:

void ctor(c* this) {
    this->x1 = 0;
    this->x2 = 0;
    // ..
}

これはCでも実現できますが、C ++では、このようなコードを記述しなくても暗黙的に実行されます。あなたはただ書くc newObj;c* obj = new c;

それとは別に、メンバー変数はプライベートである必要があり、Cライブラリコード(scanf)とC++クラスの混合-C++iostreamsでの入出力に使用します。

于 2013-01-12T10:57:06.133 に答える