Доброго времени суток!
Изучаю книгу Дейтелов, 5 издание. И вот или переводчик перегнул или я не могу понять - куда суть. На странице 162 даётся определение конструкторов. Привожу тяжёлый для поминания текст:
Не могу понять: конструктор, созданный неявно компилятором не инациализирует элеметы класса... а каким боком он вызывает конструктор другого класса? Какого такого "другого" , если речь идёт об одно конкретном? Не могу ухватить суть цепочки...
Вроде перевод достаточно правильный. То есть, компилятор видит, что в классе FistClass не указан явно конструктор и компилятор создаёт неявно конструктор. Это понятно. А при чём тут вообще другие классы? Как этот конструктор может вызывать конструктор другого класса SecondClass (к примеру)? Зачем они о них сказано? Что этот абзац хочет мне сказать?
Скорее всего авторы книги пытались быть более-менее педантично корректными и хотели учесть тот факт, что конструкторы в С++ есть только у класс-типов. У не-класс типов конструкторов нет и быть не может по определению. То есть у типа int
, например, никакого конструктора нет.
Именно так скорее всего и следует понимать данную фразу. То есть поля не класс-типов не инициализируются никак, а вот для полей, которые являются объектами классов (других, разумеется), вызываются конструкторы.
Вот для такого класса
struct S
{
int i;
std::string s;
};
компилятор неявно сгенерирует конструктор по умолчанию S::S()
. Этот конструктор не будет никак инициализировать поле i
, но будет вызывать конструктор по умолчанию для поля s
(это, согласно книге, "data member that is an object of another class").
Фраза, разумеется, сформулирована кривовато.
Современный стандарт языка описывает поведение в таких случаях примерно так:
Если пользователь не объявил явно никаких конструкторов для класса, компилятор неявно объявит и определит конструктор по умолчанию для этого класса †. Такой неявно определенный конструктор по умолчанию будет выполнять инициализацию по умолчанию всех подобъектов (полей и баз) класса.
† - за исключением тех случаев, когда конструктор по умолчанию неявно определяться не будет: наличие в классе полей типа "ссылка", наличие подобъектов класс-типов без конструктора по умолчанию и с недоступным конструктором по умолчанию, наличие полей константных типов без инициализатора и без определенного пользователем конструктора по умолчанию и т.д.
Мне ответили примером на Cyberforum. Когда запустил код, начал понимать в чём логика. Надеюсь, что кому-то тоже поможет.
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "Class A" << endl;
}
};
class B
{
public:
A a;
};
int main()
{
B b;
return 0;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Пытаюсь сделать так, чтобы при изменении значения в comboBox база данных выводилась в datagridviewВроде бы все работает, но при закрытии формы выдает...