如何重载C++的+运算符实现一行向数组添加多个元素
问题分析
你的operator+实现存在两个关键问题:
- 虽然你在函数内修改了当前对象(
this->add(num)),但返回的是一个新建的空对象a,导致后续链式调用的+操作都作用在临时对象上,而非原对象one。 - 分开调用时,每次
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
相关产品推荐
相关产品推荐

