在赋值运算符中进行浅复制

时间:2012-02-06 17:00:32

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

我需要为具有大量成员的类实现赋值运算符,我不想手动赋值。我可以先制作浅存储器副本然后执行必要的初始化吗?

class C
{
    public:
    C &operator=(const C &rhs)
    {
        if (&rhs == this)
            return *this;
        memcpy(this, &rhs, sizeof(C));
        Init(rhs);
        return *this;
    }

    .........
};

感谢。

3 个答案:

答案 0 :(得分:2)

没有。除非对象具有POD类型,否则这是未定义的行为。和 用户定义的赋值运算符意味着它不是POD。并在 实践,它可能由于多种原因而失败。

一种可能的解决方案是使用数据定义嵌套的POD类型 成员,并简单地分配它,例如:

class C
{
    struct Data { /* ... */ };
    Data myData;
public:
    C& operator=( C const& other )
    {
        myData = other.myData;
        return *this;
    }
};

当然,这意味着您需要经常引用每个成员 作为myData.x,而不仅仅是x

答案 1 :(得分:1)

嗯,你可以,但你所有复制的指针成员(如果有的话)将指向同一个对象,如果该对象超出范围,你将留下一个悬空指针指向引用它的所有其他对象。

答案 2 :(得分:0)

您正尝试使用*运算符取消引用C ++引用。除非你为这个课程定义了操作员*,否则它不会起作用。

我的意思是排队

memcpy(this, *rhs, sizeof(C));