如何从操作员函数返回动态对象?

时间:2015-05-11 11:36:41

标签: c++ operator-overloading dynamic-memory-allocation return-type

我对此很困惑。如何从操作员函数返回动态分配的对象? 请考虑以下示例:

#include "stdafx.h"
#include <iostream>
#include "vld.h"
using std::cout;
class Point
{
    public:
    Point(int x,int y) : a(x),b(y)
    { }
    Point()
    { }
    Point operator + (Point p)
    {
        Point* temp=new Point();
        temp->a=a+p.a;
        temp->b=b+p.b;
        Point p1(*temp);  // construct p1 from temp
        delete temp;      // deallocate temp
        return p1;
    }
    void show()
    {
        cout<<a<<' '<<b<<'\n';
    }
    private:
        int a,b;
};
int main()
{
    Point* p1=new Point(3,6);
    Point* p2=new Point(3,6);
    Point* p3=new Point();
    *p3=*p2+*p1;
    p3->show();
    VLDEnable();
    delete p1;
    delete p2;
    delete p3;
    VLDReportLeaks();
    system("pause");
}

在重载操作符+函数中,我是否可以在没有额外对象p1的情况下编写此程序?我怎样才能直接退回温度?

我们非常感谢您的帮助。

请帮帮我。

1 个答案:

答案 0 :(得分:3)

Java语法和C ++之间有点混淆。在C ++中,除非您希望动态分配(在堆上)对象,否则不需要new。只需使用

Point temp; // define the variable
// process it
return temp;

通过这种方式,您的本地对象将在堆栈​​中创建,您不必关心忘记delete等等。

operator+返回指针是错误的

Point* operator + (Point p) 
{ 
    Point* tmp = new Point;
    // process
    return tmp; // return the pointer to the dynamically-allocated object
}

它实际上打破了operator+,因为你无法链接它,即a+b+c将不再起作用。 那是因为a + b返回一个指针,然后a + b + c尝试在指针上调用operator+,而没有定义指针。此外,还有更严重的问题,例如在作业中构建临时对象时泄漏内存,请参阅下面@ Barry的评论。所以我希望我已经说服你返回对象,而不是指向它的指针。