2

我们可以在创建对象后再次调用它的构造函数吗?

#include <iostream>

struct A
{
    A ( ) { std::cout << "A::A" << std::endl; }
    ~A ( ) { std::cout << "A::~A" << std::endl; }
};

int main( )
{
    A a;
    a.~A();    // OK
    a.A::A();  // OK in Visual Studio 2005, 2008, 2010

    return 0;
}
4

2 回答 2

11

您不应该像这样调用构造函数,作为成员函数调用。原因是(n3242, 12.1/2):

构造函数用于初始化其类类型的对象。因为构造函数没有名称,所以在名称查找过程中永远找不到它们;然而,使用函数符号 (5.2.3) 的显式类型转换将导致调用构造函数来初始化对象。

如果你真的想在应该是一个对象的东西上调用构造函数——除非在非常特殊的情况下你不应该这样做——你可以使用调用构造函数的placement new:

new (&a) A();
于 2012-07-07T21:10:47.297 回答
8

好吧,a.A()编译失败是因为您根本无法在 C++ 中调用构造函数。(您可以通过多种方式间接调用它。)出于同样的原因,我认为a.A::A() 不应该编译。

于 2012-07-07T21:04:06.560 回答