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:是的,我确实记得见过这种方法,它看起来确实是最好的方法。