Код отображает "::" на терминале, причина неизвестна - PullRequest
0 голосов
/ 02 августа 2020
using namespace std;
struct A
{
    int i;
    A(int i_ = 13) : i(i_)
    {
        cout << _FUNCTION_ << "\n";
    }
    ~A()
    {
        cout << _FUNCTION_ << "\n";
    }
};

int main()
{
    A* p = new A;
    A a();
    return 0;
}

Когда я запускаю его, на моем терминале отображается код «A :: A». Я понимаю, что первый A вызывается из first FUNCTION для «A * p», но почему появляется «::»? И последний A после "::" от "A a ();"?

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Конструктор типа имеет то же имя, что и сам тип. :: - это оператор разрешения области видимости и используется для именования вещей, содержащихся в именованной области, например пространства имен или типа.

Конструктор 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
0 голосов
/ 02 августа 2020

_FUNCTION_ - это константа magi c, поэтому она отправляет первую букву «A» (имя вызываемой функции. С остальным ничего не поделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...