#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_constructor5. Инициализация списка . В частности,
calcSum({12, 34});
форма (7) в этой статье.
Ответ №1:
Вы можете использовать связанный список инициализации для вызова конструктора:
calcSum({5, 3});
Несколько широкий термин для этой функции C называется «неявное преобразование». Если тип объекта, которому «присвоен» (или сконструирован, что в данном случае является параметром функции), не соответствует типу объекта, которому «присвоен», в C есть длинный, длинный список правил неявных преобразований, которые можно использовать для преобразования одного типа в другой.
Одно из этих правил включает разделенный запятыми список значений в фигурных скобках. Если он указан для объекта с явным конструктором, конструктор используется для построения объекта.
Обратите внимание, что это также вызывает тот же конструктор, что и в исходном коде:
calcSum({5});
Конструктор с одним параметром не нуждается в неявном вызове фигурных скобок.
Комментарии:
1. справедливо ли это и для классов?
2. Ну, поскольку только классы имеют конструкторы в C , единственным логичным ответом было бы: да.
3. @AbhinavSinghal
struct
-это класс, в котором по умолчанию все открыто. Вclass
нем есть личное.