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 回答