我试图使用构造函数在静态函数中创建一个对象。这是代码
class A {
public:
A() { this->a = 50; std::cout << "constructor called... " << this << std::endl; setAddr(this); }
~A() { this->a = 10; std::cout << "destructor called... " << this << std::endl; }
int a;
static A* addr;
static void setAddr(A* ad) { addr = ad; }
static A &create() { A(); return *addr; }
};
A* A::addr = NULL;
int main() {
A &ptr = A::create();
std::cout << "a = " << ptr.a << std::endl;
ptr.a = 100;
std::cout << "a = " << ptr.a << std::endl;
getch();
return 0;
}
我知道使用 new 是最好的方法,但我试图使用 contructor 来知道它是否可以完成。
输出是:
构造函数调用... 009AF874
析构函数调用... 009AF874
a = 10
a = 100
现在这是我的问题,
1) 为什么在没有使用像 A obj 这样的声明创建对象时调用析构函数;
2)如果调用了析构函数,那么我如何能够为 otr.a 赋值;
通过查看程序的输出,我得出以下结论。
1)我在某处读到,在将内存分配给对象后调用了构造函数。如果创建了一个对象,那么它必须被销毁,并且 obj 的范围决定现在销毁它。
2)由于对象地址在销毁它之前具有先前的值并返回调用返回存储它的变量的地址。当我尝试访问它时,我能够这样做,因为该内存地址仍然存在。