重载赋值运算符或使用默认运算符
Overloading the assignment operator or use the default one?
如果我有
Class A {
int x;
};
Class B {
vector<A> y;
//...
};
我想重载B中的赋值运算符=
。使用默认的=
运算符就足够了吗?它会在y
成员上只使用vector
的=
运算符吗?
EDIT:说我想自己实现这样的东西,这样如果b和k都是b类型,b=k就会工作。我需要显式调用向量析构函数来释放实现中b的y成员吗?
它会是什么样子?
B& B::operator=(const B& b) {
if (this == &b) {
return *this;
}
y = b.y;
return *this;
}
原始向量this->y
会在这里被破坏吗?为什么?
使用默认的
=
运算符就足够了吗?
是的,这已经足够了,除非您有任何资源需要特殊处理或参数。
它会只使用向量在y成员上的
=
算子吗?
是的,生成的默认赋值运算符/复制构造函数将自动调用任何可用于成员变量的赋值运算符/副本构造函数。
B& B::operator=(const B& b) { if (this == &b) { return *this; } y = b.y; return *this; }
原始向量会在这里被破坏吗?为什么?
是的,它将被"销毁",因为vector<A>
的operator=()
定义意味着这样做。
实际上并不是调用了析构函数,但赋值运算符的实现确实暗示了与构建新实例相同的行为,并且当向量被清除时,所有包含的成员析构函数都将被调用。
如果没有特殊情况(如拥有指针或unique_ptr
),则可以不定义它并使用默认情况。对你来说应该没问题
在拥有指针的情况下,您会突然有两个对象指向内存中的同一数据,这可能不是您想要的行为(shared_ptr
也是如此。unique_ptr
无法复制,因此默认赋值运算符在这种情况下不起作用,您必须编写重载。
相关文章:
- 默认赋值运算符如何在实际 STL 中实现
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 放置新运算符是否会禁用默认的新运算符?
- 从类重载的新运算符运行非默认构造函数
- 为 unordered_map 中的元素设置默认构造函数(如果是 [] 运算符)
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 删除复制构造函数是否也会删除默认的复制/移动运算符?
- 模板中默认类型的重载运算符
- 是否有一种方法可以在超载运算符函数中接触默认运算符函数
- 重载运算符是具有较小默认对齐方式的新增运算符
- 默认参数中的 c++ new 运算符及其副作用
- 是否可以使用 T::运算符< 作为模板函数的默认参数?
- POD 类型是否可以具有显式声明的默认移动分配运算符
- 是否可以使 std 容器使用默认运算符为新?
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 如何在没有这个运算符的情况下实现默认运算符<<(ostream&,T)的类型?
- 标准全局默认运算符新的对齐限制是什么?
- 重载赋值运算符或使用默认运算符
- 我的测试.cpp文件使用的是默认运算符<<;这个签名有什么问题?