Использование имени структуры в качестве функции - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь понять, что делает следующая строка:

BStats stats = BStats();

Структура определяется следующим образом:

struct BStats
{
    unsigned a;
    unsigned b;

    BStats& operator+=(const BStats& rhs)
    {
        this->a += rhs.a;
        this->b += rhs.b;
        return *this;
    }
};

Но я понятия не имею, что делает эта строка. Вызывает ли он конструктор по умолчанию?

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Выражение BStats() описано в стандарте в 5.2.3 / 2:

Выражение T (), где T - это спецификатор простого типа (7.1.5.2) для не полного массива типа объекта или типа void (возможно, cv-квалифицированного), создает значение r указанного типа который инициализируется значением.

То есть выражение создает rvalue типа Bstats, который инициализирован значением . В вашем конкретном случае значение-инициализация означает, что два члена структуры BStats будут установлены в ноль.

Обратите внимание, что это отличается от поведения вызова конструктора по умолчанию , который упоминается в других ответах, поскольку конструктор по умолчанию не гарантирует, что члены установлены в 0.

0 голосов
/ 01 марта 2012

В C ++ классы и структуры почти одинаковы (разница в том, что структуры C ++ являются классами с общедоступным атрибутом по умолчанию, где класс является закрытым), так что это похоже на вызов конструктора.

0 голосов
/ 01 марта 2012

Как и любой класс, структура имеет конструктор по умолчанию, автоматически создаваемый компилятором. В вашем случае BStats () просто вызывает конструктор по умолчанию, хотя явный вызов бесполезен.

...