为什么对象1的堆中相同变量的值没有反映在object2中?

时间:2013-08-21 12:50:10

标签: c++ copy-constructor deep-copy

s(const s& src)
{ 
    cout<<"Copy\n";
    p =src.p;
}

void disp(int x=0)
{  
    *p = x;
    cout <<"Value at p :"<<*p <<endl<< p<<endl;
}

};// relevant piece of code


s s1;
s s2 = s1;    
s1.disp(200);
s2.disp();

在这个程序中,我期待的是对象s1和s2的数据成员p  指向相同的内存位置对象s1的p值的任何变化都应该 在对象s2中反映p的值。在输出中,它清楚地表示由p保持的地址 对于s1和s2都是相同的但是我没有得到s2.disp的预期结果200 function.Output是

Copy
Value at p :200
0x1e069010
Value at p :0
0x1e069010

3 个答案:

答案 0 :(得分:0)

您可以修改p - disp中的*p = x;。致电s2.disp();时,会使用默认0。 (void disp(int x=0)),因此您将*p设置为0

答案 1 :(得分:0)

我的方法是正确的,只需将变量p设为public并在调用s1.disp();之后立即打印*(s2.p)。我可以看到p的值显示为200

答案 2 :(得分:0)

在您的代码中,您可以在方法p中修改dist

* p = x;

在第二种情况下,当您拨打s2.disp()时,会使用默认值0,而*p的值为0

要反映您的需求,您可以:

class s
{
public:
    s(const s& src)
    { 
        cout<<"Copy\n";
        p = src.p;
    }

    void Display() const    // Display method just display
    {
        cout << "Value at p :" << *p << endl << p << endl;
    }

    void UpdateP( int x = 0 )
    {
        *p = x;
    }
};

s s1;
s s2 = s1;    
s1.UpdateP(200);
s1.Display();
s2.Display();

只需live example,代码不是最漂亮的,但它会告诉您它正在运行。