Следующая статья отвечает на ваш вопрос лучше, чем я когда-либо мог.Я процитировал короткий отрывок из статьи, чтобы дать вам представление о его вкусе.Ссылка появляется под цитатой.
Кстати, «Справочное руководство по C ++», из которого я цитирую, утверждает, что содержит 529 страниц питательной информации C ++;Вы можете добавить его в закладки.
Конструктор инициализирует объект.Конструктор по умолчанию - это тот, который может быть вызван без каких-либо аргументов.Если для класса нет объявленного пользователем конструктора и если класс не содержит константных или ссылочных членов данных, C ++ неявно объявляет конструктор по умолчанию для него.
Такой неявно объявленный конструктор по умолчанию выполняет операции инициализации, необходимые для создания объекта этого типа.Однако обратите внимание, что эти операции не включают инициализацию объявленных пользователем элементов данных.
Например:
class C
{
private:
int n;
char *p;
public:
virtual ~C() {}
};
void f()
{
C obj; // 1 implicitly-defined constructor is invoked
}
C ++ синтезировал конструктор для класса C, поскольку он содержит виртуальную функцию-член.После создания C ++ инициализирует скрытый элемент данных, называемый виртуальным указателем, который есть у каждого полиморфного класса.Этот указатель содержит адрес таблицы диспетчеризации, которая содержит адреса всех виртуальных функций-членов для этого класса.
Синтезированный конструктор не инициализирует элементы данных n и p и не выделяет память для данныхна что указывает последний.Эти элементы данных имеют неопределенное значение после создания объекта obj.Это связано с тем, что синтезированный конструктор по умолчанию выполняет только те операции инициализации, которые требуются реализации, а не программисту, для создания объекта.