c++中动态分配类型的重载+操作符
Overloading + Operator in C++ for a Dynamically Allocated Type
我试图覆盖一个类型的+操作符,该类型的构造函数涉及调用new(即构造函数需要动态分配其他内容),因此其析构函数涉及调用delete。在某个地方,我希望能够使用这样的东西:
T c = a + b;
我的问题是,我显然需要在+函数中创建一个类型为T的对象。如果我在+函数实现内部的堆栈上分配一个T的临时实例以通过复制返回,则该实例的析构函数将在+调用退出时和(或我相信)在赋值给c之前被调用。所以这不是一个选项。我的另一个选择似乎是使用new
,并在返回时取消对new返回的指针的引用。然而,这种方法的问题似乎是指针将不可访问,并且无法在其上调用delete
。
你确保T遵守3的规则,就没有什么可担心的了。
如果您在operator+
内的堆栈上创建临时对象,则在退出时,取决于编译器和操作符实现:
- 对象将通过复制构造函数传递给另一个临时对象,该对象将再次通过复制构造函数传递给
c
。或 - 对象将通过复制构造函数传递给
c
。或 - 临时对象实际上是
c
,并且没有复制构造函数调用。(参见http://en.wikipedia.org/wiki/Return_value_optimization)
如前所述,如果您遵循规则3并提供复制构造函数和赋值操作符的正确实现,在任何情况下都不会出现任何问题,因此您无需担心实际实现(除非您非常关注性能)。
std::string
和std::vector
不知何故能够做到这一点,你的类也是。我不建议您学习它们的源代码,因为它非常吓人。正如另一位网友所说,3法则是你的朋友。我可以补充说,你应该不调用new
在你的函数。在堆栈上分配并按值返回。c++将完成必要的魔术
相关文章:
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 重载操作符
- 如何重载操作符==外模板类使用友元函数
- 重载*操作符,使其在左右两边都工作
- 重载操作符<对于非随机迭代器
- 在c++中重载操作符的时间和原因
- 如何在c++中重载=操作符来通过引用进行复制
- 如何在c++中获取定义为友元的重载操作符的地址
- 使用重载操作符的文件操作表达式没有给出预期的结果
- 重载操作符()
- 重载操作符()并在类内使用
- 类中的重载操作符+
- 定时使用重载操作符
- c++带类的重载操作符
- 用列表容器重载[]操作符
- 重载操作符=
- 任何重载操作符()的静态检测
- 重载操作符以处理类对象
- 在使用另一个类的类中重载操作符==
- 派生类和基类中的重载操作符不同