Как работает инициализация этой структуры?

avatar
Abhinav Singhal
8 августа 2021 в 16:59
77
1
2

Я наткнулся на фрагмент кода со структурами, и теперь я совершенно не понимаю, как автоматически вызывается конструктор структуры. Я сделал фиктивный код, чтобы понять концепцию. Например,

struct obj {

    int a = 0, b = 2;

    obj (int aa) {
        a = aa;
    }
    obj (int aa, int bb) {
        a = aa;
        b = bb;
    }

    int getSum () {
        return a+b;
    }
};

void calcSum (obj o) {
    cout << o.getSum() << endl;
}

int main()
{
    calcSum(5);
    return 0;
}

Это печатает 7. Я считаю, что конструктор с одним аргументом struct obj вызывается автоматически. Если да, то как я могу заставить его автоматически вызывать конструктор с двойным аргументом? Я не могу этого сделать.

Как называется эта функция?

Также, пожалуйста, укажите мне несколько хороших статей, так как я не смог их найти.

Источник
ShadowMitia
8 августа 2021 в 17:02
2

Вы не можете вызвать конструктор, который требует два аргумента с одним аргументом.

Igor Tandetnik
8 августа 2021 в 17:02
2

Это достаточно автоматически? calcSum({12, 34}); В любом случае, термин для дальнейшего исследования - неявное преобразование.

HolyBlackCat
8 августа 2021 в 17:03
1

Или calcSum(obj(12, 34)).

Abhinav Singhal
8 августа 2021 в 17:05
0

@ HolyBlackCat да, это достаточно интуитивно понятно. но @Igor Tandetnik я не понимаю, как и почему это работает? Как это называется?

mediocrevegetable1
8 августа 2021 в 17:16
1

Пометка вашего конструктора как explicit должна предотвратить это BTW. Также см. этот en.cppreference.com/w/cpp/language/converting_constructor

Igor Tandetnik
8 августа 2021 в 22:17
1

Инициализация списка. В частности, calcSum({12, 34}); — это форма (7) в этой статье.

Ответы (1)

avatar
Sam Varshavchik
8 августа 2021 в 17:06
4

Для вызова конструктора можно использовать список инициализации в фигурных скобках:

calcSum({5, 3});

Несколько широкий термин для этой возможности C++ называется "неявное преобразование". Если тип объекта, который «назначается» (или конструируется, что в данном случае является параметром функции), не соответствует типу объекта, «назначаемого из», C++ имеет длинный, длинный список правил неявных преобразований. который можно использовать для преобразования одного типа в другой.

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

Обратите внимание, что здесь также вызывается тот же конструктор, что и в исходном коде:

calcSum({5});

Конструктор с одним параметром не требует неявного вызова фигурных скобок.

Abhinav Singhal
8 августа 2021 в 18:47
0

относится ли это и к классам?

Sam Varshavchik
8 августа 2021 в 18:57
1

Что ж, поскольку в C++ конструкторы есть только у классов, то единственным логичным ответом будет: да.

Robert Andrzejuk
8 августа 2021 в 19:31
1

@AbhinavSinghal struct — это класс, в котором по умолчанию все общедоступно. В class это приват.