Страницы

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

вторник, 17 марта 2020 г.

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

#конструктор #cpp


Могу ли я записать конструктор копирования через оператор присваивания?
Например вот так:
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();    


Ответы

Ответ 1



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

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

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