为什么在将对象作为参数传递时调用析构函数而不调用构造
Why destructor is being called but construction not being called when passing object as a parameter?
如果我写一个名为Test的类,并写一个类似的Test-typeshow()函数
#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和return tt的析构函数,但没有为它们创建构造函数,但通常我们知道首先会创建构造函数,完成任务后会调用析构函数。但为什么在传递和返回任何对象时会出现异常?
通过值传递类的实例会调用复制构造函数。
如果类定义没有显式提供复制构造函数,编译器默认情况下实现复制构造函数(本质上是调用任何基类的复制构造函数后的成员复制)。此编译器生成的副本构造函数不会调用您已实现的其他构造函数之一,因此构造副本不会打印任何内容。但是,完成后将调用析构函数来清理副本。
在您的类中,如果您实现了一个复制构造函数,如下所示;
Test(const Test &from) : x(from.x)
{
std::cout << "Copy constructor invoked" << std::endl;
}
您会发现复制构造函数确实被调用了。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常