c++ - 在 C++ 中使用不同对象类型作为操作数的运算符重载
问题描述
class myClass
{
public:
int myVal;
myClass(int val) : myVal(val)
{
}
myClass& operator+(myClass& obj)
{
myVal = myVal + obj.myVal;
return *this;
}
myClass& operator+(int inVal)
{
myVal = myVal + inVal;
return *this;
}
myClass& operator=(myClass& obj)
{
myVal = obj.myVal;
return *this;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
myClass obj1(10);
myClass obj2(10);
obj1 = obj1 + obj2;
obj1 = 20 + obj2; // Error : No matching operands for operator "+"
return 0;
}
如何将整数和 myClass 对象类型的运算符“+”作为操作数实现?(obj1 = 20 + obj2)
解决方案
您通常将二进制算术+=
(复合赋值)运算符实现为成员函数,并+
作为使用前者的非成员函数;这允许提供后者的多个重载,例如当自定义二进制算术运算符的两个操作数不属于同一类型时:
class MyClass
{
public:
int myVal;
MyClass(int val) : myVal(val) {}
MyClass& operator+=(int rhs) {
myVal += rhs;
return *this;
}
};
inline MyClass operator+(MyClass lhs, int rhs) {
lhs += rhs;
return lhs;
}
inline MyClass operator+(int lhs, MyClass rhs) {
rhs += lhs;
return rhs;
// OR:
// return rhs + lhs;
}
int main() {
MyClass obj1(10);
MyClass obj2(10);
obj1 = 20 + obj2;
obj1 = obj1 + 42;
}
有关运算符重载的一般最佳实践建议,请参阅以下问答:
推荐阅读
- r - 如何使用for循环(在R中)运行函数(x),如果它返回NA,用函数(y)的输出替换NA?
- javascript - TypeScript 的 get 和 set 的类型定义
- python - 在 django 中为用户创建的数据仅在不同的类中创建下拉菜单
- python - 无法在 GitLab CI 的 docker/compose 映像中使用 DynamoDB docker 映像
- c# - C# 是否有办法将具有 int 字段(字节、ushort、ulong 等)的对象编写为字节数组?
- groovy - 在 Groovy 中重建地图
- java - 在链接列表中的特定位置插入节点,附加元素时抛出运行时错误
- javascript - Postman 获取url请求参数的值做一个测试
- c++ - 模板化派生类隐藏基类成员?
- javascript - 无法找出这个错误:Can't perform a React state update on an unmounted component