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

#c #struct

Вопрос:

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

 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 автоматически вызывается. Если да, то как я могу заставить его автоматически вызывать конструктор с двойным аргументом? Я не могу этого сделать.

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

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

Комментарии:

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

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

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

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

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

Ответ №1:

Вы можете использовать связанный список инициализации для вызова конструктора:

 calcSum({5, 3});
 

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

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

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

 calcSum({5});
 

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

Комментарии:

1. справедливо ли это и для классов?

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

3. @AbhinavSinghal struct -это класс, в котором по умолчанию все открыто. В class нем есть личное.