在C ++中为动态分配类型重载+运算符

时间:2011-07-17 00:46:47

标签: c++

我正在尝试为构造函数涉及调用new的类型覆盖+运算符(也就是说,构造函数需要动态分配其他东西),因此析构函数涉及调用delete。在某个地方,我希望能够使用类似的东西:

T c = a + b;

我的问题是我显然需要在+函数内创建一个T类型的对象。如果我在+函数实现中的堆栈上分配一个T的临时实例来返回副本,那么在分配给c之前,该实例的析构函数将被调用为+调用退出和(或者我相信)。所以这不是一个选择。我的另一个选择似乎是使用new并在返回时取消引用new返回的指针。然而,这种方法的问题似乎是指针将无法访问,并且无法在其上调用delete

所以我的问题是......不能在涉及动态分配的类型上重载运算符的情况很少见。人们如何处理这种情况?

3 个答案:

答案 0 :(得分:3)

你确保T服从The Rule of 3,并且没有后顾之忧。

答案 1 :(得分:3)

如果在operator+内的堆栈上创建临时对象,则在退出时,取决于编译器和运算符实现:

  1. 该对象将通过复制构造函数传递给另一个临时对象,该对象将再次通过复制构造函数传递给c OR
  2. 该对象将通过复制构造函数传递给c OR
  3. 临时对象实际上是c,并且没有复制构造函数调用。 (见http://en.wikipedia.org/wiki/Return_value_optimization
  4. 如前所述,如果您遵循3规则并提供正确的复制构造函数和赋值运算符的实现,则在任何情况下都不会出现任何问题,因此您无需担心实际实现(除非您'对表现感到疯狂)。这就是OOP。

答案 2 :(得分:0)

std::stringstd::vector能以某种方式做到这一点,而你的课程也是如此。我不建议你学习他们的源代码,这是非常令人生畏的。正如另一张海报所说,3的规则是你的朋友。我可以补充一点,你应该在你的函数中调用new。在堆栈上分配并按值返回。 C ++将做必要的魔术。