理解C++重构语法

Tho*_*eod 2 c++ syntax constructor scope language-lawyer

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

jpa*_*cek 11

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

构造函数用于初始化其类类型的对象.因为构造函数没有名称,所以在名称查找期间永远不会找到它们; 但是,使用函数表示法(5.2.3)的显式类型转换将导致调用构造函数来初始化对象.

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

new (&a) A();
Run Code Online (Sandbox Code Playgroud)

  • 并且不要忘记先破坏物体! (2认同)

sbi*_*sbi 8

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

  • 确实:*构造函数没有名称*.它永远不会在名称查找中找到,因此无法直接调用. (3认同)