You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:27