1

次のように、ポインター メンバーを含むクラスを作成し、クラスのインスタンスを構築するときにそのポインターを初期化します。

#include "stdafx.h"
#include <iostream>

class MyClass {
public:
    MyClass(int x): p(&x){}

    int getValueOfp() 
    {
        return *p;
    }

private:
    int* p;
};

int _tmain(int argc, _TCHAR* argv[])
{
    int x=5;
    MyClass obj1(x);
    std::cout<<obj1.getValueOfp();
    return 0;
}

問題は、出力を呼び出しgetValueOf()たときに、指しているはずの変数の値ではないことですp(この場合、5 を指しているはずなのでx)。私はこの問題に対する可能な答えを求めてウェブを検索しましたが、運が悪かったのですが、ここで何が間違っているのか教えてもらえますか? (ご覧のとおり、私は Visual Studio Express で作業しています)。

4

1 に答える 1

4
MyClass(int x) : p(&x) {}

パラメータは値で渡されるため、コピーが作成されます。このコピーは、コンストラクタ本体の終わりまでに期限切れになる一時的な値です。したがってp、実際のパラメーターのアドレスで初期化するのではなく、単にそのローカルコピーを初期化します。後でポインターを逆参照すると、整数がそれまでに期限切れになるため、実際の値は見つかりません。これは未定義の動作です。コピーが実行されないように、引数を参照渡しする必要があります。

MyClass(int& x) : p(&x) {}
//      ^^^^
于 2013-06-14T01:01:37.897 に答える