#include <iostream>
using namespace std;
class A
{
int n;
public:
A()
{
cout << "Constructor called" << endl;
}
~A()
{
cout << "Destructor called" << endl;
}
};
int main()
{
A a; //Constructor called
A b = a; //Constructor not called
return 0;
}
输出:
Constructor called
Destructor called
Destructor called
在析构函数被调用两次时调用构造函数 这里有什么快乐的?这是未定义的行为吗?
答案 0 :(得分:13)
第二行调用所谓的复制构造函数。就像律师一样,如果你没有律师,编制者会为你提供一个。
当您使用相同类型的另一个变量初始化变量时,它是一种特殊类型的转换器。
A b(a)
A b = a
这两个都会调用它。
A(const A& a)
{
cout << "Copy Constructor called" << endl;
//manually copy one object to another
}
添加此代码以查看它。 Wikipedia有更多信息。
答案 1 :(得分:3)
在摘录
中 A b = a
您没有调用构造函数,而是生成的复制构造函数:
class A
{
int n;
public:
A()
{
cout << "Constructor called" << endl;
}
A(const A& rv)
{
cout << "Copy constructor called" << endl;
// If you are not using default copy constructor, you need
// to copy fields by yourself.
this->n = rv.n;
}
~A()
{
cout << "Destructor called" << endl;
}
};
答案 2 :(得分:2)
Default Copy Constructor用于创建第二个实例。 离开范围时,两个对象的目标处理器称为
答案 3 :(得分:0)
创建了对象A的两个实例。一个是由构造函数创建的,另一个是由复制构造函数创建的。由于您没有明确定义一个,编译器为您完成了工作。
一旦app退出,由于有两个对象,析构函数方法被调用两次。
答案 4 :(得分:0)
A b = a =&gt; A b(a)=&gt;这会调用类的默认复制构造函数。