我需要为具有大量成员的类实现赋值运算符,我不想手动赋值。我可以先制作浅存储器副本然后执行必要的初始化吗?
class C
{
public:
C &operator=(const C &rhs)
{
if (&rhs == this)
return *this;
memcpy(this, &rhs, sizeof(C));
Init(rhs);
return *this;
}
.........
};
感谢。
答案 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));