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

时间:2016-02-18 15:27:52

标签: c++

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

it "can upload an image" do
  post :picture, avatar: fixture_file_upload('files/spongebob.png', 'image/png')
  response.should be_success
end

语句MyType A; MyType B; MyType C; A = B - C; A = C - B; 不应再次调用MyType的构造函数,因为已经创建了A,即构造函数只能在此程序中调用3次。有没有办法在保持良好语法的同时实现这一目标?我怀疑我可以让操作员函数知道不要创建一个对象,而是使用一些引用。是否有一种更简化的方法来使用我不知道的c ++语法来做到这一点?

A = B - C

4 个答案:

答案 0 :(得分:4)

没有丑陋的技巧,比如创建对象池并在内部使用它们(复杂性比这种情况下的任何好处更复杂),没有办法实现这一点。问题是那个声明:

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不必复制它的参数。所以这个解决方案可以被认为是我之前提到的复杂技巧。

答案 1 :(得分:2)

  

我希望操作更新不创建对象

对于A = B - C;A将{strong}更新,operator=

更具体地说,operator-的返回值是按值传递的,必须在operator-中创建临时变量,然后复制/移动到A

BTW1:OperatorReturnObj= Left - Right;将导致无限递归。

BTW2:MyType A();确实是一个函数声明。 Most vexing parse

答案 2 :(得分:1)

你不能。

在A = B-C中,首先评估B-C表达式。然后将结果复制到A. B-C表达式对A一无所知,因此无法直接更新A. 您可以重载赋值运算符,但这不会阻止创建新对象。

答案 3 :(得分:0)

一些提示:

首先,您没有指定如何初始化内部指针属性,所以此时它指向内存堆栈中未指定的值。

其次,operator- 方法(!)并未像您那样定义。 look at "binary arithmetic operators" 二元运算符必须返回对它们被调用的对象的引用。

第三,对象本身通过"自动" 传递给它的方法,并且它可用作this指针。 所以你不要必须将它作为第一个参数传递。 最后,要返回引用,您必须返回值,而不是指针: - > *this

所以像A=B+C这样的表达式被评估为:

A.operator=(B.operator+(C))

所以B + C与C + B不同。 (我不在这里输入继承的细节..)

受到上述the same previous link的启发:

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!! 
    }

}

希望能够澄清你的疑虑。