正在确定Plusequals运算符语法
Determining Plusequals Operator Syntax
我对c++还很陌生,正在努力学习自定义运算符。我目前遇到的问题是定义我自己的+=运算符以及实现它的最佳方法。这涉及到一个简单的类,该类具有可以添加到的公共int成员(intValue)。下面两个代码示例,我一次尝试了一个,据我所知,在我的程序中操作完全相同。所谓"完全相同",我的意思是我得到了相同的结果,并创建了相同数量的对象。
哪一个更正确(标准做法),为什么?
Utility& operator +=(Utility& left, Utility right)
{
return left = left + right;
}
或
void operator +=(Utility& left, Utility right)
{
left = left + right;
}
如果重要的话,他们打电话给运营商:
Utility operator +(Utility left, Utility right)
{
return Utility(left.intValue + right.intValue);
}
每当调用该类的构造函数时,它都会打印出一条消息,这样我就可以判断是否正在生成一个新对象。基于此,我在这里尝试的+=的两种形式会导致创建相同数量的对象。
由于+=
通常修改其左侧操作数,因此您通常宁愿不要根据operator+
实现它(需要创建一个临时值来保存结果)。
同样,由于不能合理地对左操作数进行转换,因此它实际上应该是一个成员函数。
Utility &Utility::operator+=(Utility const &right) {
intValue += right.intValue;
return *this;
}
通常,人们会期望+=
修改左手操作数,最好避免用operator +
实现它,这会导致创建临时值。
此外,
Utility& operator +=(Utility& left, Utility right)
{
return left = left + right;
}
在返回结果的意义上,它比另一个更好。这使得用户能够编写复合表达式,如:
Utility utility1 , utility2;
Utility ut += (utility1 += utility2);
但如果你可以在没有operator+
的情况下对Utility
进行内部修改,那会更好。
相关文章:
- C++语法运算符功能?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 无效删除运算符语法
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 这个typedef和转换运算符语法是什么意思
- C++ lambda 和运算符语法
- 如何使用 Boost Spirit x3 编写具有两个后操作数语法的二进制运算符?
- 将强制转换运算符重载到 std::map 的正确语法是什么
- 奇怪的语法构造 - 应用于 typedef 的运算符 () 使用 VS2015 成功编译
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 适用于全局模板运算符指定模板参数的适当语法
- C 中的controad()括号的语法运算符
- 全局新运算符调用语法
- 模板的赋值运算符(成员函数)实现的正确语法
- 这个奇怪的条件运算符语法是什么
- 为什么在使用初始化语法时不调用转换运算符,为什么 clang 错误消息看起来是错误的
- 运算符重载中的C++语法不明确
- 条件运算符语法
- C++运算符语法,用于处理 a = b + c,而无需在 "a.data_ptr" 中显式复制数据
- 正在确定Plusequals运算符语法