Давайте разберем класс MusicAlbum
только для его переменных-членов:
class MusicAlbum
{
//...
string artist;
string title;
int year;
};
Учитывая, что это переменные-члены, создание копий MusicAlbum
совершенно безопасно для выполнения , если у вас естькомпилятор делает копии .Таким образом, нет необходимости предоставлять пользовательский конструктор копирования и оператор присваивания.std::string
имеет правильную семантику копирования из коробки, а int
, очевидно, безопасно для копирования.Таким образом, это простое решение:
удалить эти функции из вашего класса .
Если, однако, MusicAlbum
содержит указатели на динамически распределенную память или ресурсы, которые необходимо обработатьили какой-то другой аспект, который реализация компилятора по умолчанию конструктора копирования и оператора присваивания не предоставит правильно, тогда да, вы бы написали определяемый пользователем конструктор копирования / оператор присваивания.
Итак, что можетпроизойдет, если вы предоставите функции конструктора копирования и оператора присваивания, когда вам не нужно их предоставлять?
Единственные результаты:
- Вы написали эти функции правильно.
- Вы написали эти функции неправильно.
Можно подумать, что вариант 1.
будет в порядке.Возможно, но недостатком является то, что вы, возможно, написали свою версию неэффективно (скорее всего, вы сделали).Копия / назначение по умолчанию компилятора всегда будет работать правильно и была бы написана эффективно.
Что касается опции 2.
, это то, что происходит с вашим кодом.Вместо того, чтобы отлаживать, просто удалите эти функции.Если вы должны были отладить и заставить эти функции работать правильно, вы попадаете обратно в пункт 1
в списке.Таким образом, вы действительно ничего не получили, кроме нескольких минут или часов написания и отладки функций, которые вам не нужно было писать в первую очередь.
Так что не тратьте свое время на написание функций, которые компилятор ужеобеспечивает для вас.Учитывая переменные-члены в вашем классе, компилятор всегда будет делать копии правильно.