С++/CLI, статический конструктор вне объявления класса

Как поместить тело статического конструктора объявленного класса вне класса? Этот синтаксис представляется компилируемым, но действительно ли это означает статический конструктор или просто статическую (= не видимую внешнюю функцию перевода)?

ref class Foo {
    static Foo();
}

static Foo::Foo() {}

Ответы

Ответ 1

Да, это правильный синтаксис для создания статического конструктора С++/CLI. Вы можете знать, что он не создает статическую функцию, поскольку это не является допустимым синтаксисом объявления функции. Функции должны иметь указанный тип возврата. Кроме того, компилятор будет жаловаться, что Foo() не является членом класса Foo, если он не связывает его с конструктором, который вы указали в определении класса.

Вы можете легко протестировать:

using namespace System;

ref class Foo {
    static Foo();
    Foo();
}

static Foo::Foo() { Console.WriteLine("Static Constructor"); }
Foo::Foo() { Console.WriteLine("Constructor"); }

int main(array<System::String ^> ^args)
{
    Foo ^f = gcnew Foo();
    Console.WriteLine("Main");
}

Это приведет к выводу:

Статический конструктор
Конструктор
Главная