Sentence类拷贝赋值操作符为何等价于a+b?如何正确实现拷贝赋值?
问题分析与解决方案
问题根源
你的Sentence类中拷贝赋值运算符operator=的实现错误,它没有先清空当前对象已有的Clause_arr内容,而是直接将源对象的元素追加到当前对象的容器末尾。这就导致执行a = b时,a原本的元素不会被清除,最终效果和a + b(合并a和b的所有元素)完全一致。
另外还有一个隐藏问题:operator!=的实现会触发无限递归,因为它直接返回(*this != x),本质是调用自身,需要修正。
修改方案
只需要修改拷贝赋值运算符operator=,不需要修改构造函数,同时修正operator!=的错误:
修正后的拷贝赋值运算符
可以直接利用std::vector自带的拷贝赋值功能,无需手动循环,代码更简洁可靠:
Sentence& operator = (const Sentence& s) { // 直接替换当前容器内容,等价于先清空再拷贝 Clause_arr = s.Clause_arr; return *this; }
如果坚持手动实现循环,需要先清空当前容器:
Sentence& operator = (const Sentence& s) { // 第一步:清空当前对象的已有内容 Clause_arr.clear(); // 第二步:拷贝源对象的元素 for(const auto& clause : s.Clause_arr) { Clause_arr.push_back(clause); } return *this; }
修正operator!=
bool operator !=(const Sentence& x) const { // 调用已实现的operator==取反,避免递归 return !(*this == x); }
额外优化:简化拷贝构造函数
你的拷贝构造函数手动循环拷贝vector元素,其实完全可以借助vector的拷贝构造简化:
Sentence(const Sentence& s) : Clause_arr(s.Clause_arr) {}
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

