Страницы

Поиск по вопросам

четверг, 6 июня 2019 г.

Конструкторы и операторы копирования

Могу ли я записать конструктор копирования через оператор присваивания? Например вот так: A::A(const A * a) { *this = a; }
A &A::operator=(const A * a) { delete str; str = new char[strlen(a->str)+1]; strcpy(str, a->str); return *this;
} Еще хочется уточнить, правильно ли если я делаю A * a в примере выше, потому примеры с разных сайтов A & a. C этого всплывает вопрос, что должен возвращать оператор присваивание: A &A::operator=(const A * a) или A * A::operator=(const A * a) Вообщем правильный ли мой код выше? Объект класса создается так A * a = new A();


Ответ

Конструктор копирования можно написать через оператор присваивания, не вопрос. Только то, что вы пишете — это не конструктор копирования и не оператор присваивания. Для них аргументом является экземпляр класса, а не указатель на него. Код неправильный ещё и по другой причине: вы не учитываете случай копирования объекта в себя Сигнатура конструктора копирования обязана быть A(A& a) или A(const A& a) (есть ещё немного экзотических возможностей, вот документация), всё остальное, в частности, то, что у вас — не конструктор копирования. Сигнатура оператора копирующего присваивания (а начиная с C++11 возможен и перемещающий) обязана быть A& operator= (A a) или A& operator= (const A& a) (документация), всё остальное — не оператор копирующего присваивания. В частности, у вас просто конструктор из стороннего типа, и оператор присваивания значения стороннего типа. Указатель на A для A — сторонний тип.

Комментариев нет:

Отправить комментарий