为什么同一个类对象的构造函数和析构函数被隐式调用多次

暖先生

英语不是我的母语,所以请原谅我的语法问题。

当我运行我的程序时,我发现在定义对象和显式调用构造函数时会调用类构造函数。在调用构造函数和离开作用域之后,析构函数被调用了两次。

#include<iostream>
class test {
private:
    int a;
    int b;
    int c;
public:
    test(int first = 0, int second = 0, int third=0 );
    void show();
    ~test();
};

void test::show() {
    std::cout << this->a<<"\n";
}
test::test(int first , int second , int third ) {
    this->a = first;
    this->b = second;
    this->c = third;
    std::cout << "Construct\n";
}
test::~test() { std::cout << "destruct\n"; }

extern test myclassone;
#include <iostream>
#include "myhead.h"

test myclassone;
int main()
{
    std::cout << "begain\n";
    {
        std::cout << "mid\n";
        myclassone = test(1,1,1);
        std::cout << "mid\n";
        myclassone.show();
    }
    std::cout << "end\n";
}

这个程序的输出是

Construct
begain
mid
Construct
destruct
mid
1
end
destruct

在我的期望中,构造函数和析构函数只会被调用一次。但令人费解的是,根据输出,它们被调用了两次。我google了这个问题,很多答案都没有解释为什么在定义对象时调用构造函数,以及为什么在调用构造函数后立即调用析构函数

麦克猫

你的程序运行如下:

  1. 为全局对象调用构造函数test myclassone;
  2. main() 叫做。
  3. begainmid打印出来。
  4. 为时态对象调用构造函数test(1,1,1)
  5. 临时对象被分配给全局对象。
  6. 为时态对象调用析构函数test(1,1,1)
  7. mid 被打印。
  8. myclassone.show() 叫做。
  9. end 被打印。
  10. 从 返回main()
  11. 为全局对象调用析构函数 test myclassone;

因此,构造函数和析构函数为每个对象调用一次,总共调用两次。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在构造时调用C ++类的析构函数?

为对象分配值时为什么调用构造函数和析构函数

为什么带有用户声明的析构函数的类具有隐式默认构造函数?

为什么在具有用户定义的析构函数的类中获得隐式移动构造函数

为什么类模板中的成员函数在同一个地址创建同一个对象

当类中有一个虚函数时,隐式生成的析构函数也是虚的吗?

为什么数组中的对象的析构函数被另一个替换时没有被调用?

为什么析构函数比构造函数调用得更多?

为什么“ = default”析构函数与隐式声明的析构函数不同?

为什么不能在析构函数可以的同时显式调用构造函数?

为什么std :: vector的构造函数调用自定义类的析构函数?

为什么析构函数被调用两次而构造函数仅被调用一次?

为什么我需要绑定一个通过同一个对象调用的阴影函数?

多次调用同一个函数让我出错

为什么析构函数需要一个未被删除的对象?

在同一个类的构造函数中传递类的对象

在同一个类中使用构造函数参数时,为什么可以访问私有属性

对象的构造函数和析构函数

为什么 C++ 线程多次调用析构函数?

为什么类的默认构造函数和析构函数是内联的?

NodeJS:静态方法可以调用同一个类的构造函数吗?

为什么这个函数/构造函数参数变成了一个自由的隐式变量?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

为什么我不能在 Javascript 中的同一个类函数中调用一个类函数?

C ++为什么在堆栈中构造完对象后立即调用析构函数?

无法在同一个类中调用函数

在同一个类中调用函数指针

为什么不调用继承类的析构函数?

为什么在父类之前调用子类的析构函数?