通过引用返回新对象

时间:2015-09-08 12:20:05

标签: c++ c++11

来自更多Java背景我想知道如何通过引用返回一个新对象。我希望Fraction类是不可变的,因此每个操作都返回一个带有操作结果的新对象。

这将是我在Java中的代码:

class Fraction {
    int numerator;
    int denominator;

    // Constructor

    Fraction multiply(Fraction other) {
        return new Fraction(other.numerator * this.numerator, 
                            other.denominator * this.denominator);
    }

}

但是,如果我在C ++中这样做,我会创建内存泄漏,因为我无法清理已初始化的Fraction对象,因为我只有对该对象的引用。那么,我如何在C ++中处理这个问题呢?

class Fraction {
private:
    int32_t numerator;
    int32_t denominator;
 public:
    Fraction(int32_t numerator, int32_t denominator) {
        this->numerator = numerator;
        this->denominator = denominator;
    }

    Fraction& operator*(Fraction& other) {

        auto numerator = other.numerator * this->numerator;
        auto denominator = other.denominator * this.denominator;

        return *(new Fraction(numerator, denominator))
    }
};

2 个答案:

答案 0 :(得分:16)

根本不要使用new,只需按值返回。

Fraction operator*(Fraction const& other) const
{
    auto numerator = other.numerator * this->numerator;
    auto denominator = other.denominator * this->denominator;

    return Fraction(numerator, denominator);
}

您的后一种方法将产生leaked pointer。由于return value optimization

,您无需担心复制的Fraction被复制

答案 1 :(得分:1)

在C ++中,您可以控制放置对象的位置。 您可以根据需要选择堆栈/堆。

我现在不想让你感到困惑,但你可以查找使用" placement new"如果你想更多地控制对象在内存中的位置。

我不是JAVA的专家,但上次检查时,你必须使用new来在java中分配一个对象。

我认为这里已经很好地解释了。当在c ++中使用/不使用new时。

When to use "new" and when not to, in C++?

欢迎来到C ++世界