当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?

拉齐布·侯赛因·舒沃(Razib Hossain Shuvo)

如果我编写一个名为Test并编写一个Test类型的show()函数,例如

#include <iostream>
using namespace std;

class Test{

public:
    int x;
    Test()
    {
        cout<<"Empty or Default Constructor"<<endl;
    }
    Test(int x)
    {
        cout<<"Valued constructor"<<endl;
    }
    ~Test()
    {
        cout<<"Destructor"<<x<<endl;
    }
    Test show(Test obj)
    {
        Test tt;
        tt.x=20;
        return tt;
    }
};
int main()
{
    Test t1,t2(20);
    t2.show(t2);

    return 0;
}

输出 :

Empty or Default Constructor
Valued constructor
Empty or Default Constructor
Destructor : 20
Destructor : 1988276941
Destructor : 1988276941
Destructor : 1972875622

然后输出显示Test obj的Destructor返回tt,但没有为它们创建任何构造函数,但通常我们知道首先会创建构造函数,并且在完成任务后将调用destructor,但是为什么在传递和返回任何对象时异常?

通过值传递类的实例将调用复制构造函数。

如果类定义未明确提供副本构造函数,则编译器默认情况下实现副本构造函数(在调用任何基类的副本构造函数之后,基本上是成员复制)。该编译器生成的副本构造函数不会调用您已实现的其他构造函数之一,因此构造副本不会打印任何内容。但是,完成后将调用析构函数来清理副本。

在您的类中,如果您实现一个复制构造函数,则如下:

Test(const Test &from) : x(from.x)
{
    std::cout << "Copy constructor invoked" << std::endl;
}

您会发现确实调用了复制构造函数。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在声明指向对象的指针时不调用析构函数

来自分类Dev

为什么std :: vector :: emplace调用析构函数而不调用任何拷贝构造函数?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

当我单击控制台上的关闭按钮时,为什么不调用析构函数?

来自分类Dev

为什么在使用赋值时不调用析构函数的堆栈变量?

来自分类Dev

移动构造函数不调用析构函数?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么在调用luaL_error时未调用C ++对象析构函数?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

来自分类Dev

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

来自分类Dev

为什么调用从对象移出的析构函数?

来自分类Dev

将原子传递给可变参数时,为什么要调用复制构造函数?

来自分类Dev

C ++:删除对象而不调用析构函数

来自分类Dev

如果析构函数被删除,为什么要调用它,而如果没有删除,为什么不调用它呢?

来自分类Dev

为什么在函数返回时不调用复制构造函数?

来自分类Dev

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

来自分类Dev

删除void指针时不调用析构函数

来自分类Dev

什么时候在C ++中调用要调用的对象的析构函数?

来自分类Dev

为什么构造函数/析构函数被调用一次?

来自分类Dev

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

来自分类Dev

为什么构造函数调用取决于默认析构函数的存在?

来自分类Dev

将对象作为构造函数的参数传递

来自分类Dev

为什么不调用move构造函数?

来自分类Dev

为什么不调用复制构造函数

来自分类Dev

为什么operator *不调用构造函数?

Related 相关文章

  1. 1

    为什么在声明指向对象的指针时不调用析构函数

  2. 2

    为什么std :: vector :: emplace调用析构函数而不调用任何拷贝构造函数?

  3. 3

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

  4. 4

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

  5. 5

    当我单击控制台上的关闭按钮时,为什么不调用析构函数?

  6. 6

    为什么在使用赋值时不调用析构函数的堆栈变量?

  7. 7

    移动构造函数不调用析构函数?

  8. 8

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

  9. 9

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

  10. 10

    为什么在调用luaL_error时未调用C ++对象析构函数?

  11. 11

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

  12. 12

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

  13. 13

    当对象绑定到成员函数时,为什么std :: function会调用析构函数?

  14. 14

    当对象绑定到成员函数时,为什么std :: function会调用析构函数?

  15. 15

    为什么调用从对象移出的析构函数?

  16. 16

    将原子传递给可变参数时,为什么要调用复制构造函数?

  17. 17

    C ++:删除对象而不调用析构函数

  18. 18

    如果析构函数被删除,为什么要调用它,而如果没有删除,为什么不调用它呢?

  19. 19

    为什么在函数返回时不调用复制构造函数?

  20. 20

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

  21. 21

    删除void指针时不调用析构函数

  22. 22

    什么时候在C ++中调用要调用的对象的析构函数?

  23. 23

    为什么构造函数/析构函数被调用一次?

  24. 24

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

  25. 25

    为什么构造函数调用取决于默认析构函数的存在?

  26. 26

    将对象作为构造函数的参数传递

  27. 27

    为什么不调用move构造函数?

  28. 28

    为什么不调用复制构造函数

  29. 29

    为什么operator *不调用构造函数?

热门标签

归档