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

如何重载C++的+运算符实现一行向数组添加多个元素

问题分析

你的operator+实现存在两个关键问题:

  1. 虽然你在函数内修改了当前对象(this->add(num)),但返回的是一个新建的空对象a,导致后续链式调用的+操作都作用在临时对象上,而非原对象one。
  2. 分开调用时,每次one + num都会直接修改one,所以结果符合预期;但链式调用时,只有第一个+19修改了one,后续所有+操作都在临时空对象上执行,原对象one不会再被更新。
解决方案

根据你的需求,有三种可行的实现方式,推荐优先选择符合C++语义的方案:

方案1:重载operator+=(推荐)

+=的标准语义就是修改当前对象并返回自身引用,完美适配链式添加场景:

template<typename Item>
SortedCollection<Item>& SortedCollection<Item>::operator+=(Item num){
    this->add(num);
    return *this; // 返回当前对象的引用,支持链式调用
}

调用方式:

SortedCollection<int> one;
// 链式调用一行完成添加
one += 19 += 9 += 2 += 8 += 7 += 12 += 17 += 0 += 11 += 6 += 3 += 1;

// 或者更易读的拆分写法(效果完全一致)
// one += 19; one += 9; one += 2; ...

方案2:修改operator+以支持链式修改原对象(不推荐)

如果你坚持要用+运算符,可修改其返回值为当前对象的引用,但这违背了operator+的常规语义(通常a + b返回新对象,不修改原对象),仅适合特定场景:

template<typename Item>
SortedCollection<Item>& SortedCollection<Item>::operator+(Item num){
    this->add(num);
    return *this; // 返回当前对象引用,让后续+操作仍作用于原对象
}

调用方式和你原来的写法一致:

SortedCollection<int> one;
one + 19 + 9 + 2 + 8 + 7 + 12 + 17 + 0 + 11 + 6 + 3 + 1;

方案3:让operator+返回新对象(符合标准语义)

如果希望operator+保持创建新对象的标准行为,同时通过链式调用生成包含所有元素的新对象,最后赋值给原对象:

template<typename Item>
SortedCollection<Item> SortedCollection<Item>::operator+(Item num) const {
    SortedCollection<Item> result = *this; // 复制当前对象的所有元素
    result.add(num); // 给新对象添加元素
    return result; // 返回新对象
}

调用方式:

SortedCollection<int> one;
one = one + 19 + 9 + 2 + 8 + 7 + 12 + 17 + 0 + 11 + 6 + 3 + 1;

内容的提问来源于stack exchange,提问作者Ten Fern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:35:22