如何在不修改操作数的情况下使用运算符重载链
How do I use a chain of operator overloads without modifying the operands?
假设我们有这个类A:
class A
{
public:
int a;
A(int b)
{
a = b;
}
};
我想创建一个+重载,这样我就可以像这样使用它
A a(1),b(2),c(3),&d;
d = a + b + c;
无需修改每个对象的内容。下一个合乎逻辑的事情是每次分配一个新的内存块,如下所示:
A &operator+ (const A &b)
{
A *c = new A(a+b.a);
return *c;
}
但这会产生一个新问题:中间结果丢失,导致内存泄漏。我本可以通过创建一个静态函数来轻松解决这个问题,该函数接受三个 A 对象引用并将前两个对象的总和存储在第三个对象中,但我敢打赌,一定有某种方法可以让 + 重载以我想要的方式发生。
所以问题是:有什么方法可以使用运算符重载链,这些运算符重载不会修改操作数而不会导致内存泄漏?
您可以简单地使用按值传递并执行以下操作:
A operator+ (A other) //pass by value
{
other.a += a;
return other;
}
或者,由于成员a
是可公开访问的,因此您可以(相反应该)将operator+
设置为非成员函数,如下所示:
A operator+(A left, A const &right)
{
left.a += right.a;
return left;
}
请注意,第一个参数由值接受,第二个参数由引用接受。这样,您无需在函数中声明局部变量。您可以使用第一个参数;毕竟它是函数的本地,你可以用它做任何你想做的事情:在这种情况下,我们只需向它添加right.a
,然后返回它。
更好的类设计是这样的:(阅读评论)
class A
{
int a; //make it private
public:
A(int b) : a(b) //use member initialization list
{
}
A& operator+=(A const & other) //add `+=` overload, as member of the class
{
a += other.a;
return *this;
}
};
//and make `+` non-member and non-friend
A operator+(A left, A const & right)
{
left += right; //compute this in terms of `+=` which is a member function
return left;
}
无需在 operator+
中使用指针。您可以在堆栈中分配中间对象,然后将其返回:
A operator+ (const A &b)
{
A c(a+b.a);
return c;
}
或者只是:
A operator+ (const A &b)
{
return A(a+b.a);
}
甚至更简单:
A operator+ (const A &b)
{
return a+b.a;
}
由于这隐式地调用了A::A(int)
.
请注意,我从返回类型中删除了引用。不能返回对本地的非常量引用。
然后你会这样使用它:
A a(1),b(2),c(3),d;
d = a + b + c;
请注意,d
不再是引用。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板