【问题标题】:Making shallow copy inside assignment operator在赋值运算符中进行浅拷贝
【发布时间】:2012-02-28 03:44:30
【问题描述】:

我需要为一个有很多我不想手动分配的成员的类实现一个赋值运算符。我可以先做一个浅内存拷贝,然后再进行必要的初始化吗?

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

    .........
};

谢谢。

【问题讨论】:

  • 我不确定,但您必须先检查自分配。例如if(this == &rhs) return *this;
  • @mcnicholls:嗯,实现= 的理想方法是复制和交换成语
  • @Als:是的,我确实记得看到过这种方法,它看起来确实是最好的方法。

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


【解决方案1】:

您正在尝试使用 * 运算符取消引用 C++ 引用。除非您为此类定义了 operator*,否则它将无法正常工作。

我的意思是排队

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

【讨论】:

    【解决方案2】:

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

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

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

    当然,这意味着您需要不断引用每个成员 作为myData.x,而不是简单的x

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-08-01
        • 2012-11-19
        • 1970-01-01
        • 2019-10-25
        • 2021-11-28
        • 2013-06-19
        • 2016-05-28
        相关资源
        最近更新 更多