Конструктор типа имеет то же имя, что и сам тип. ::
- это оператор разрешения области видимости и используется для именования вещей, содержащихся в именованной области, например пространства имен или типа.
Конструктор A
, следовательно, A::A
. Первый A
- это имя типа, а второй - имя конструктора; ::
означает, что конструктор объявлен в рамках типа.
Это отражает способ определения членов типа после объявления без определения. Например:
struct A
{
int i;
A(int i_ = 13);
~A();
};
// Note how we have to refer to the constructor to define it since we are
// no longer within the scope of A:
A::A(int i_) : i(i_)
{
cout << _FUNCTION_ << "\n";
}
// Similar for the destructor.
A::~A()
{
cout << _FUNCTION_ << "\n";
}
Вы должны видеть только A::A
в своем выводе. Обратите внимание, что вы создаете здесь только одно значение A
:
A* p = new A;
Вы никогда не delete p;
, поэтому вы не видите соответствующий вызов деструктора (A::~A
) в вывод.
Эта строка не создает переменную типа A
; скорее, он объявляет функцию с именем a
, которая не принимает аргументов и возвращает значение A
. Эта функция никогда не вызывается (и не определяется):
A a();
Это неприятный синтаксический анализ (не путать с наиболее неприятным синтаксическим анализом ). Очевидно, вы намеревались объявить переменную, но это может быть или объявление переменной функции или , а грамматика предпочитает объявление функции.
Чтобы исправить это, либо удалите скобки или используйте единый синтаксис инициализации C ++ 11:
A a; // Default initialization
A a{}; // Uniform initialization