来自更多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))
}
};
答案 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 ++世界