Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在赋值运算符内进行浅复制_C++_Operator Overloading_Copy Constructor_Deep Copy - Fatal编程技术网

C++ 在赋值运算符内进行浅复制

C++ 在赋值运算符内进行浅复制,c++,operator-overloading,copy-constructor,deep-copy,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);

我需要为一个包含很多成员的类实现一个赋值操作符,我不想手动赋值。我是否可以先进行浅内存复制,然后执行必要的初始化

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

    .........
};

谢谢。

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

当然可以,但是所有复制的指针成员(如果有的话)然后将指向同一对象,如果该对象超出范围,您将看到一个指向该对象的所有其他对象的悬空指针。

否。除非该对象具有POD类型,否则这是未定义的行为。及 用户定义的赋值运算符表示它不是POD。而且 在实践中,它可能会失败,原因有很多

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

class C
{
    struct Data { /* ... */ };
    Data myData;
public:
    C& operator=( C const& other )
    {
        myData = other.myData;
        return *this;
    }
};
当然,这意味着你需要经常提到每个成员
作为
myData.x
,而不仅仅是
x

否。除非对象具有POD类型,否则这是未定义的行为。及 用户定义的赋值运算符表示它不是POD。而且 在实践中,它可能会失败,原因有很多

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

class C
{
    struct Data { /* ... */ };
    Data myData;
public:
    C& operator=( C const& other )
    {
        myData = other.myData;
        return *this;
    }
};
当然,这意味着你需要经常提到每个成员
如<代码> MyDATa. X/COD>,而不是简单地<代码> x< /Cord>.< /P> < p>您试图使用*运算符来引用C++引用。除非你为这个类定义了操作符*,否则它不会起作用

我是说排队

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

您试图使用*运算符来引用C++引用。除非你为这个类定义了操作符*,否则它不会起作用

我是说排队

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

我不确定,但你必须先检查一下自我分配。e、 g.如果(this==&rhs)返回*this@麦克尼科尔斯:嗯,实现
=
的理想方法是通过复制和交换习惯用法。@Als:是的,我记得见过这种方法,它看起来确实是最好的方法。我不确定,但你必须先检查自我分配。e、 g.如果(this==&rhs)返回*this@麦克尼科尔斯:嗯,实现
=
的理想方法是通过复制和交换习惯用法。@Als:是的,我确实记得见过这种方法,它看起来确实是最好的方法。