【问题标题】:Object creation from existing object从现有对象创建对象
【发布时间】:2013-11-18 20:57:15
【问题描述】:

为什么下面程序的输出是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;
}

【问题讨论】:

  • 你了解什么是指针以及它们是如何工作的吗?
  • 因为您将其值设置为 200?你还需要一个析构函数来删除你的指针
  • 看看 C 指针示例。这应该澄清它

标签: c++ oop c++11 copy-constructor assignment-operator


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢弗拉德。分配新内存的第二点很酷。
    • @roy 分配内存并不酷,它需要你记住删除它,这很容易被忽略。完全不使用指针要好得多
    • @David 我明白你的意思。我只是很欣赏可以做到这一点的事实。
    【解决方案3】:

    正如大家已经提到的,您使用的是指针,因此当您调用复制构造函数时,您实际上所做的只是将rhs.m_plnt 的地址分配给this.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

    【讨论】:

      【解决方案4】:

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

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

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

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

      int * p1 = new int();  // Create an integer
      *p1 = 100;
      int * p2 = p1;         // Point to the same integer
      *p2 = 200;
      

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 1970-01-01
        • 2021-01-14
        • 2014-01-14
        相关资源
        最近更新 更多