我想在其中创建一个带有指针成员的类,并在构造类的实例时初始化该指针,如下所示:
#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。)
答案 0 :(得分:4)
MyClass(int x) : p(&x) {}
您的参数按值传递,因此将进行复制。此副本是一个临时值,将在构造函数体的末尾到期。因此,您不是使用实际参数的地址初始化p
,而只是使用本地副本。稍后取消引用指针时,您将无法在其中找到实际值,因为此时整数将过期,即未定义行为。您需要通过引用传递您的参数,以便不执行副本:
MyClass(int& x) : p(&x) {}
// ^^^^