C++ 没有新返回对象的算术运算符
C++ Arithmetic Operator without new return object
相当简单的概念。我有一个算术运算符,我希望操作更新而不是创建对象。本质上
MyType A;
MyType B;
MyType C;
A = B - C;
A = C - B;
语句A = B - C
不应该再次调用 MyType 的构造函数,因为 A 已经创建,即构造函数应该只在这个程序中调用 3 次。有没有办法在保持良好语法的同时实现这一目标?我怀疑我可以让运算符函数知道不要创建对象,而是使用一些引用。有没有一种更简化的方法可以使用一些我不知道的 c++ 语法来做到这一点?
class MyType
{
MyType* OperatorReturnObj;
MyType operator-(const MyType& Left, const MyType& Right)
{
// This removed and replaced with SetOperatorReturnObj function
// MyType OperatorReturnObj();
OperatorReturnObj= Left - Right;
return OperatorReturnObj;
}
void MyType SetOperatorReturnObj(MyType* Ref)
{
OperatorReturnObj = Ref;
}
};
如果没有丑陋的技巧,例如创建对象池并在内部使用它们(在这种情况下,复杂性将比任何好处都更昂贵),就没有办法实现这一目标。问题是那句话:
A = B - C;
等于:
A.operator=( operator-( B, C ) );
如您所见operator-( B, C )
必须首先执行并在某处提供结果。因此,您必须更改语法,例如:
A += B; A -= C; // or even
(A += B) -= C; // or maybe
A += B -= C;
或者使用常规语法,如果需要效率,请实现移动语义。
经过一番思考,您可以创建类型为 MyTypeExression
的对象,该对象不执行实际计算,但会记住参数和操作,并且仅在稍后执行MyType::operator=(MyTypeExression)
时执行。尽管要使其正常工作,您可能需要一个带有智能指针的包装器MyType
这样MyTypeExression
就不必复制它的参数。因此,此解决方案可以被认为是我之前提到的复杂技巧。
我希望操作更新而不是创建对象
对于A = B - C;
,A
将按 operator=
更新。
更具体地说,operator-
的返回值是按值传递的,则必须在operator-
内部创建一个临时变量,然后复制/移动到A
。
BTW1:OperatorReturnObj= Left - Right;
将导致无限递归。
BTW2:MyType A();
确实是一个函数声明。最令人烦恼的解析
。
在 A = B - C 中,首先计算 B - C 表达式。然后将结果复制到 A。B - C 表达式对 A 一无所知,因此无法直接更新 A。您可以重载赋值运算符,但这不会阻止创建新对象。
一些提示:
首先,您没有指定如何初始化内部指针属性,因此此时它指向内存堆栈中未指定的值。
其次,operator-
方法(!)的定义不像你那样。 看看"二进制算术运算符"二进制运算符必须返回对从中调用它们的对象的引用。
第三,对象本身"自动"传递给其方法,并可用作this
指针。因此,您不必将其作为第一个参数传递。最后,要返回引用,您必须返回值,而不是指针:--> *this
。
因此,像 A=B+C
这样的表达式的计算结果为:
A.operator=(B.operator+(C))
所以 B+C 与 C+B 不同(我在这里不输入继承的细节。
灵感来自上面相同的上一个链接:
class X {
int internalprivatevalue;
//....
public:
X& operator+(const X& second) {
// actual addition of second to *this takes place here
// e.g. internalprivatevalue+=second. internalprivatevalue;
return *this; // return the result by reference!!
}
}
希望能澄清更多的疑虑。
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 运算符重载 += 添加新对象
- 如何用 2 个对象过度引导运算符
- C++内联运算符重载中,请参阅当前对象
- 使用运算符"="在C++中用值初始化对象
- C++运算符重载做双 * 对象
- 如何在自定义对象的<<运算符中添加自定义前缀
- 尝试重载输出运算符时,我无法遍历对象向量
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 在之后仍需要使用源对象时调用父移动分配运算符
- 错误:三元运算符无法在对象中正常工作"cout"
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 无法使用迭代器查找类对象。(二进制 '==': 'userInfo' 不定义此运算符)
- 重载加法运算符(使用函数向对象添加字符串)
- 临时对象上的运算符重载
- 如何使用运算符+重载函数正确返回对象?
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 基于 C++98 中函数对象运算符 () 签名的“重载”函数模板