如果我有
Class A {
int x;
};
Class B {
vector<A> y;
//...
};
我想在B中重载赋值运算符=
。使用默认的=
运算符是否足够?它会仅使用=
成员vector
的{{1}}运算符吗?
编辑:说我想自己实现类似的东西,这样如果b和k都是B类,b = k就可以工作。我需要显式调用向量析构函数来释放b的y成员,在实现中?
它看起来如何?
y
原始载体B& B::operator=(const B& b) {
if (this == &b) {
return *this;
}
y = b.y;
return *this;
}
会在这里被破坏吗?为什么呢?
答案 0 :(得分:4)
使用默认的
=
运算符是否足够?
是的,这是足够的,除非您有任何需要特殊处理或参数的资源。
它会在y成员上使用向量的
=
运算符吗?
是的,生成的默认赋值运算符/复制构造函数将自动调用任何可用于成员变量的赋值运算符/复制构造函数。
B& B::operator=(const B& b) { if (this == &b) { return *this; } y = b.y; return *this; }
此处的原始矢量是否会在此处被破坏?为什么呢?
是的,它将“destructed”,因为operator=()
的{{1}}定义意味着这样做。
调用析构函数并不是真的,但是赋值运算符的实现确实意味着与构造新实例的行为相同,并且在清除向量时将调用所有包含的成员析构函数。 / p>
答案 1 :(得分:1)
如果您没有特殊情况(例如拥有指针或unique_ptr
),您可以不定义它并使用默认情况。在你的情况下它应该没问题。
如果拥有指针,你会突然有两个对象指向内存中的相同数据,这可能不是你想要的行为(同样适用于shared_ptr
。
无法复制unique_ptr
,因此默认赋值运算符在这种情况下不起作用,您必须编写重载。