C++中如何复用函数行为以避免+与+=运算符的重复定义?
C++运算符重载代码复用方案
你提供的原始代码除了存在重复代码的问题外,operator+的实现也不符合常规语义:现有实现会直接修改左操作数本身,不符合加法运算返回新对象、不修改原操作数的预期。
最优复用方案
C++中针对算术运算符和对应的赋值运算符组合,通用的复用逻辑是:
- 优先实现修改自身的赋值运算符(如
+=)作为类成员函数,所有核心逻辑仅在这里实现一次 - 普通算术运算符(如
+)基于赋值运算符实现,无需重复编写逻辑
修改后的完整代码
#include <iostream> using namespace std; struct Vec{ int x; int y; // 仅在+=中实现核心逻辑 Vec& operator+=(const Vec &v){ x += v.x; y += v.y; return *this; } }; // +运算符基于+=实现,无重复逻辑 Vec operator+(const Vec& lhs, const Vec& rhs) { Vec temp = lhs; // 复制左操作数,不修改原对象 temp += rhs; // 复用已有的+=逻辑 return temp; } ostream& operator<<(ostream &out, const Vec &v){ return out << "x : " << v.x << "\ny : " << v.y << "\n"; }
额外说明
- 这种模式可以推广到所有同类运算符组合,比如
-与-=、*与*=、/与/=等 - 将普通算术运算符实现为非成员函数,还可以支持左操作数为其他类型的重载场景,兼容性更好
内容的提问来源于stack exchange,提问作者g0x0
相关产品推荐
相关产品推荐

