没有新返回对象的 C++ 算术运算符

标签 c++

这是一个相当简单的概念。我有一个算术运算符,我希望该操作是更新 而不是创建 一个对象。本质上,

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/

相关文章:

c++ - BerkeleyDB Db->使用自定义比较函数时无法工作

c++ - 编译 boost spirit 解析器时出现奇怪的 static_cast 编译错误

c++ - 为什么向此方法添加 cout 行会阻止我的程序在 Windows 中触发缓冲区溢出异常?

c++ - 没有排序的第三大区域

c++ - std::forward 和复制构造函数

c++ - 使用正向迭代器反向迭代

c++ - 模板参数提取和修改

C++ if 语句 : first condition superseding the second - UB or well defined?

c++ - 用 C++ 编写的 xll 内存分析器

c++ - 使用数学获取范围内的数字