0

重载 = 运算符时,应该使一个对象的内容等于另一个对象的内容,还是使对象的指针指向同一个对象?

回顾这个问题,似乎应该复制内容而不是指针。但我就是想不通,所以如果有人能解释我应该做什么,我将不胜感激,我知道如何同时做,我只是不确定选择哪一个。

class IntObject
{
private:
    int *pi_One;

public:

    IntObject(void);

    IntObject::IntObject(int const &i_one);

    ~IntObject(void);

    IntObject & operator=(const IntObject&);

};

IntObject::IntObject()
{
    pi_One = new int(0); 
}

IntObject::IntObject(int const &i_one)
{
    pi_One = new int(i_one); 
}

IntObject::~IntObject(void)
{
    delete pi_One;
}

IntObject & IntObject::operator=(const IntObject& c) {
//This copies the pointer to the ints
    this->pi_One = c.pi_One;

    return *this;  
}
4

5 回答 5

3

这取决于您希望在类型中具有什么语义。如果您想要值语义,则复制内容(深拷贝,如 中的情况std::vector),如果您想要引用语义(浅拷贝,如中std::shared_ptr

于 2012-08-01T16:32:05.260 回答
2

您绝对应该复制内容,而不是指针。想想当持有相同指针的对象之一被销毁时你会做什么;你不能删除指针,因为另一个对象也会受到影响,但你也不能不删除它,因为你会导致内存泄漏。您必须使用引用计数,一切都会变得更加复杂。

于 2012-08-01T16:45:52.680 回答
0

内容应该被复制(事实上,改变对象的指针实际上是不可能的——我无法想象你会怎么做——即使是这样,你也不应该这样做)。您还必须注意深拷贝和浅拷贝之间的差异,特别是如果您的类包含指针(或其中包含指针的容器)。

现在我想起来了,我什至不确定您可能想要重新分配哪个指针。除非您已经在使用指针 - 那些已经有一个不应该重载的 '=' 运算符。

于 2012-08-01T16:29:22.263 回答
0

最小惊讶原则会说复制内容。在任何其他对象上使用operator=时,您不会期望它复制指针。

于 2012-08-01T16:29:32.633 回答
0

如果你保持你的析构函数不变,那么你应该改变赋值重载。没有人试图将 IntObject 分配给自己也是明智的:

IntObject & IntObject::operator=(const IntObject& c) {
    if (this != &c)
    {
        //This copies the pointer to the ints
        *this->pi_One = *c.pi_One;
    }
    return *this;  
}

否则,将尝试在 IntObject 的析构函数中释放已释放的内存

于 2012-08-01T16:45:56.993 回答