Что такое синтезированный конструктор? - PullRequest
2 голосов
/ 17 февраля 2012

Что это?У меня есть смутное понимание, что синтезированный конструктор - это конструктор, неявно созданный компилятором, который также инициализирует свои объекты класса-члена, но может или не может удовлетворить потребности реализации программы.Правильно ли это определение?

И в каких случаях оно будет синтезировано, а в каких - нет?

1 Ответ

3 голосов
/ 17 февраля 2012

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

Кстати, «Справочное руководство по 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.Это связано с тем, что синтезированный конструктор по умолчанию выполняет только те операции инициализации, которые требуются реализации, а не программисту, для создания объекта.

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...