这是我一直试图了解其工作原理的代码。
#include <iostream>
using namespace std;
class A
{
public:
int variable;
A()
{
cout << "Default Constructor\n";
}
A(int variable_)
{
cout << "Overloaded Constructor\n";
variable = variable_;
}
A(A& Object)
{
cout << "Copy Constructor\n";
variable = Object.variable;
}
~A()
{
cout << "Destructor\n";
}
};
void main()
{
{
A* PA1 = new A(1);
cout << "\n";
A* PA2 = &(A(*(PA1)));
cout << "Second\n\n";
A* PA3 = &(A(1));
cout << "\n";
A* PA4 = new A(*(PA3));
}
cout << "\n";
system("pause");
}
为什么在PA2
初始化后调用析构函数?这是什么意思 - &(A(*(PA1))) and &(A(1))
?
这是此代码的输出:
答案 0 :(得分:0)
因为它们是临时对象,当它们超出范围时会被杀死。
&amp;(A(*(PA1)))表示A对象的地址,它由复制构造函数构成,其输入变量由PA1指向。
&amp;(A(1))表示A对象的地址,它由带有输入变量1的复制构造函数构成。
在这两种情况下,这些对象都是临时的。
答案 1 :(得分:0)
&(A(*(PA1)))
调用A(*(PA1))
并返回指向变量的指针。因为这是一个构造函数,所以它返回一个A
类型的变量,因为你传递的是一个类型为A的变量,它会调用复制构造函数。这不是好代码,因为返回是在临时内存中。这种行为是未定义的,所以在编写代码时不应该使用它。
&(A(1))
执行与上面相同的操作,但调用带有int的构造函数,因为这是您传递给它的内容。
调用析构函数的原因是因为C ++会自动销毁未使用/其范围到期的变量。因此,当您在不使用new
关键字的情况下调用构造函数时,会创建对象,但您不会将其存储在任何位置;你存储它的地址,如上所述是未定义的行为。因此构造函数返回的值(因此称为临时值)会立即销毁。
答案 2 :(得分:0)
您的语句A* PA3 = &(A(1))
会创建一个临时对象,该对象将在语句后立即销毁。因此,此时将调用析构函数,即在语句之后。
看起来好像你在PA3
仍然指向(被破坏的)临时对象的地址这一事实。
请注意,在C ++中,销毁对象不会更改/重置指向此对象的任何指针。只是定义了通过这样的指针访问已删除的对象会调用未定义的行为。因此,PA3
指向与临时对象的this
相同的地址并不奇怪。但是,取消引用此指针将产生未定义的行为。