【问题标题】:Calls of a constructor in C++ is not equal to the number of calls of the destructor in C++ [duplicate]C ++中构造函数的调用不等于C ++中析构函数的调用次数[重复]
【发布时间】:2016-02-08 05:14:35
【问题描述】:

希望我的帖子能找到你。

我已经尝试了一些东西,我需要一个解释

我为复数创建了一个类,在构造函数实现中打印单词“constructor”,在析构函数实现中打印单词“destructor”。

我已经声明了 3 个对象,将它们按值发送到一个非类成员函数,该函数将类中的两个对象作为参数并返回一个类对象作为两个复数的总和

我发现,析构函数调用的次数并不等于构造函数调用的次数,实际上它们更多。

我有 2 个构造函数调用和 4 个析构函数调用。

有人对这件事有什么解释吗?

非常感谢您的合作和帮助。

【问题讨论】:

  • 还定义复制构造函数并打印它的调用。可能你会用这种方式平衡建造和破坏的数量。
  • 您是在所有构造函数(默认构造函数、复制构造函数和移动构造函数)中打印日志还是仅在其中一个中打印日志?
  • 我已经实现了默认构造函数和一个带有 2 个参数的构造函数,我只使用了它们,并且在它们中都放置了打印指令。
  • @101010 :即使我没有使用它们?
  • 您可能正在隐式使用它们。阅读rule of five

标签: c++ class oop constructor destructor


【解决方案1】:

有很多构造函数,其中一些可能会为你创建:

默认构造函数MyClass() 做最少的工作来设置MyClass 的对象。

复制构造函数MyClass(const MyClass & source)source 复制到MyClass 的全新对象中

Move 构造函数MyClass(MyClass && source) 将source 的内容移动到一个全新的MyClass 对象中,并将source 留空,但处于安全状态。

很多时候,您会发现复制构造函数在后台悄悄使用,而您没有声明或请求它。例如,

myVector.push_back(myObject); 

会经常将 myObject 复制到 myVector 中。

void MyFunction(MyClass myObject)

按值接受 myObject 并且可以在进程中复制源对象。要查看实际情况:

void MyFunction(MyClass myObject) // copy constructs myObject from the caller's parameter
{
    myVector.push_back(myObject); // copy constructs a myClass into myVector from myObject
} // destructs myObject

在此调用中,创建了两个新对象,一个销毁了一个。如果你没有定义一个带有打印行的复制构造函数,那么显示它发生了,你只会看到一个神秘的析构函数调用。当vector被销毁、清除或从中移除myObject时,将会有另一个析构函数调用。

MyClass MyOtherFunction()

如果必须,将复制返回的 MyClass,但通常会找到解决方法。

这不是解决方案,但可能是解决方案的路径:添加一个包含打印语句的复制构造函数。

MyClass(const MyClass & source)
{
    // copy all member variables from source to this
    std::cout << "Copy constructor called" << std::endl;
}

我建议您阅读Rule of Three 以了解为什么这很重要。提示:这与过度成就西斯无关。

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多