1

为什么下面程序的输出是 200-200?这里只是改变object2成员变量的值。

class X
{
private:
   int *m_plnt;

public:
   X():m_plnt(new int()){}
   X(const X & rhs)
   {
      m_plnt = rhs.m_plnt;
   }
   void setvalue(int value) { *m_plnt = value; }

   int getvalue(){return *m_plnt;}
};

int main()
{
   X obj1;
   obj1.setvalue(100);
   X obj2(obj1); 
   obj2.setvalue(200); // how its changing obj1.m_plnt value
   return 0;
}
4

4 回答 4

2

为什么下面程序的输出是 200-200?

因为你只有一个整数和两个指向它的指针。

这里只是改变object2成员变量的值。

不,您没有更改成员变量;您正在更改它指向的值。两个类都包含一个指向同一个整数的指针。没有课程,您可以更清楚地看到这一点;它与

int * p1 = new int();  // Create an integer
*p1 = 100;
int * p2 = p1;         // Point to the same integer
*p2 = 200;
于 2013-11-07T09:43:38.663 回答
1

正如大家已经提到的那样,您正在使用指针,因此当您调用复制构造函数时,您实际上所做的就是将地址分配rhs.m_plntthis.m_plant. 这意味着对任何一个对象的任何更改都会导致另一个对象的更改。

此外,由于您似乎不需要动态整数数组,因此不需要指针。看看这段代码:

#include <iostream>

class X
{
private:
   int m_plnt;

public:
   X():m_plnt(int()){}
   X(const X & rhs)
   {
      m_plnt = rhs.m_plnt;
   }
   void setvalue(int value) { m_plnt = value; }

   int getvalue(){return m_plnt;}
};

int main()
{
   X obj1;
   obj1.setvalue(100);
   X obj2(obj1); 
   obj2.setvalue(200); // how its changing obj1.m_plnt value
   std::cout << obj1.getvalue() << "-" << obj2.getvalue() << std::endl;
   return 0;
}

这将输出:

100-200

于 2013-11-07T09:43:01.850 回答
1

当您制作 obj1 的副本时,您正在获取指针的副本,因此 obj1 和 obj2 指向相同的值。

于 2013-11-07T09:31:26.490 回答
1

类定义包含具有指向 int 的指针类型的数据成员。在使用复制构造函数期间,此指针的值从原始对象复制到创建的对象。因此,两个对象都有指向相同内存地址的指针,即两个对象共享相同的内存位置。程序的输出证明了这一事实。您可以更改复制构造函数,以便分配新内存。例如

X(const X & rhs) : m_plnt(new int(*rhs.m_plnt)) { }

在这种情况下,新对象拥有自己分配的内存,原始对象的更改不会影响新对象。

于 2013-11-07T09:38:32.267 回答