Конструктор класса. Не пойму. C++

95
06 января 2022, 01:00

Доброго времени суток!

Изучаю книгу Дейтелов, 5 издание. И вот или переводчик перегнул или я не могу понять - куда суть. На странице 162 даётся определение конструкторов. Привожу тяжёлый для поминания текст:

  1. Для класса, который не определяет конструктора, конструктор по умолчанию неявно создается компилятором. Такой конструктор не инициали­зирует элементов данных класса, однако вызывает конструктор по умол­чанию для каждого элемента, являющегося объектом другого класса.

Не могу понять: конструктор, созданный неявно компилятором не инациализирует элеметы класса... а каким боком он вызывает конструктор другого класса? Какого такого "другого" , если речь идёт об одно конкретном? Не могу ухватить суть цепочки...

  1. The compiler implicitly creates a default constructor in a class that does not define a constructor. Such a default constructor does not initialize the class's data members, but does call the default constructor for each data member that is an object of another class.

Вроде перевод достаточно правильный. То есть, компилятор видит, что в классе FistClass не указан явно конструктор и компилятор создаёт неявно конструктор. Это понятно. А при чём тут вообще другие классы? Как этот конструктор может вызывать конструктор другого класса SecondClass (к примеру)? Зачем они о них сказано? Что этот абзац хочет мне сказать?

Answer 1

Скорее всего авторы книги пытались быть более-менее педантично корректными и хотели учесть тот факт, что конструкторы в С++ есть только у класс-типов. У не-класс типов конструкторов нет и быть не может по определению. То есть у типа int, например, никакого конструктора нет.

Именно так скорее всего и следует понимать данную фразу. То есть поля не класс-типов не инициализируются никак, а вот для полей, которые являются объектами классов (других, разумеется), вызываются конструкторы.

Вот для такого класса

struct S
{
  int i;
  std::string s;
};

компилятор неявно сгенерирует конструктор по умолчанию S::S(). Этот конструктор не будет никак инициализировать поле i, но будет вызывать конструктор по умолчанию для поля s (это, согласно книге, "data member that is an object of another class").

Фраза, разумеется, сформулирована кривовато.

Современный стандарт языка описывает поведение в таких случаях примерно так:

  • Если пользователь не объявил явно никаких конструкторов для класса, компилятор неявно объявит и определит конструктор по умолчанию для этого класса †. Такой неявно определенный конструктор по умолчанию будет выполнять инициализацию по умолчанию всех подобъектов (полей и баз) класса.

    • Для подобъектов класс-типов инициализация по умолчанию означает вызов их конструкторов по умолчанию.
    • Для подобъектов типа "массив" инициализация по умолчанию означает инициализацию по умолчанию элементов массива.
    • Для подобъектов остальных типов инициализация по умолчанию означает отсутствие инициализации вообще.

     

    † - за исключением тех случаев, когда конструктор по умолчанию неявно определяться не будет: наличие в классе полей типа "ссылка", наличие подобъектов класс-типов без конструктора по умолчанию и с недоступным конструктором по умолчанию, наличие полей константных типов без инициализатора и без определенного пользователем конструктора по умолчанию и т.д.

Answer 2

Мне ответили примером на 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;
}
READ ALSO
Не получается сделать задание по массивам [закрыт]

Не получается сделать задание по массивам [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

196
Быстродействие объединения строк

Быстродействие объединения строк

Какой способ объединения строк следует когда использовать

95
Как получить объект нужного типа?

Как получить объект нужного типа?

У меня есть список с формами(SystemWindows

176
Форма закрывается с ошибкой

Форма закрывается с ошибкой

Пытаюсь сделать так, чтобы при изменении значения в comboBox база данных выводилась в datagridviewВроде бы все работает, но при закрытии формы выдает...

103