c++中动态分配类型的重载+操作符

Overloading + Operator in C++ for a Dynamically Allocated Type

本文关键字:重载 操作符 类型 动态分配 c++      更新时间:2023-10-16

我试图覆盖一个类型的+操作符,该类型的构造函数涉及调用new(即构造函数需要动态分配其他内容),因此其析构函数涉及调用delete。在某个地方,我希望能够使用这样的东西:

T c = a + b;

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

所以我的问题是……在涉及动态分配的类型上重载操作符的情况不可能那么少见。人们通常如何处理这种情况?

你确保T遵守3的规则,就没有什么可担心的了。

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

  1. 对象将通过复制构造函数传递给另一个临时对象,该对象将再次通过复制构造函数传递给c
  2. 对象将通过复制构造函数传递给c
  3. 临时对象实际上是c,并且没有复制构造函数调用。(参见http://en.wikipedia.org/wiki/Return_value_optimization)

如前所述,如果您遵循规则3并提供复制构造函数和赋值操作符的正确实现,在任何情况下都不会出现任何问题,因此您无需担心实际实现(除非您非常关注性能)。

std::stringstd::vector不知何故能够做到这一点,你的类也是。我不建议您学习它们的源代码,因为它非常吓人。正如另一位网友所说,3法则是你的朋友。我可以补充说,你应该调用new在你的函数。在堆栈上分配并按值返回。c++将完成必要的魔术