如何在操作员中调用操作员 =
how to call operator + in operator +=
以这种方式定义操作员 =是正确的吗?
void operator +=(const BigNumber& other)
{
*this=(*this) + other;
}
在这样的课程中:
class BigNumber
{
public:
//....
BigNumber operator +(const BigNumber& other)
{
return sum(other);
}
//....
}
是。但是正确的方法是用operator+=
实现operator+
:
struct foo
{
int value;
foo& operator+=( const foo& other )
{
value += foo.value;
return *this ;
}
friend foo operator+( foo lhs , const foo& rhs )
{
return lhs += rhs;
}
};
为什么?
首先,二进制operator+()
不应定义为成员函数,而不是自由函数。这使您可以实现第一个参数不是foo
的添加。常见的成语是在班级内声明friend
以骑封装。
第二,这种方式提供了一个连贯,可维护和有效的接口。
连贯性:
如果您实现了+=
操作,则用户SPECT(在极少数情况下)类型也提供了二进制添加。用+=
实施+
提供了这一点,以确保两个操作的行为连贯。
可维护性:
您已经使用+=
实现了+
,因此真正执行添加的代码仅在>>中写成。如果您将来需要更改操作,则必须仅更改一个代码,并且如果它的错误仅在一个站点中。简化代码重复是一个很好的做法。
效率:
编写operator+()
的方式允许编译器轻松地副本,从而提高二进制添加的性能。
使用的成语为"复制第一操作数,在其上进行操作,返回副本" 。因此,编译器可以轻松执行返回值优化(RVO)。此外,它通过值传递了第一个操作数,而不是在功能中通过手动复制操作数。这允许编译器在第一个操作数为rvalue (让编译器决定何时以及如何复制)时执行更多复制精神。
是的,您可以按照自己的方式进行操作:
BigNumber& operator +=(const BigNumber& other)
{
*this=(*this) + other;
return *this;
}
通常的方法是相反的方法:
// Note a is no const reference
BigNumber operator + (BigNumber a, const BigNumber& b)
{
return a += b;
}
您方法的理由可能是内存分配。
相关文章:
- 为什么STD :: SPAN超载函数调用操作员索引
- C 操作员超载调用驱动器
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- 任何操作员,功能调用和构造函数的通用持续时间表
- 如何超载操作员 如果调用对象不是类对象
- 为什么要调用复制操作员
- 是否可以使用明确的模板参数调用模板的用户定义转换操作员
- 为什么逗号运算符在运算符[]中打电话给操作员[],而不是在Operator()内部调用
- 如何在模板结构中调用操作员
- 调用指针参数从const函数指向的对象的操作员
- 您如何在unique_ptr上调用函数调用操作员
- 用两个参数调用新操作员,但没有分配
- 这些不同的方式在“ this”上调用操作员有什么区别
- 调用转换操作员
- 我可以在没有流对象的情况下调用流操作员的过载
- 在这种情况下,哪个操作员被调用
- 如何在操作员中调用操作员 =
- 为什么我的副本分配操作员从未被调用
- munmap_chunk 当操作员调用时指针无效,然后调用 destroctor
- 如何使此操作员调用明确无误