这是一个相当简单的概念。我有一个算术运算符,我希望该操作是更新 而不是创建 一个对象。本质上,
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
不必复制它的参数。所以这个解决方案可以认为是我之前提到的复杂技巧。
关于没有新返回对象的 C++ 算术运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35485586/