Что происходит, когда я делаю присваивание объекту, у которого есть конструктор копирования, но нет оператора присваивания?
Будет ли он вызывать оператор присваивания компилятора, выполняющий элементное копирование?
Конструктор копирования не играет никакой роли в присваивании, будет вызван оператор присваивания по умолчанию, который будет делать побитовую копию встроенных членов типа и оператора присваивания вызова для членов объекта class
тип.
Все классы имеют оператор присваивания, если вы явно не удалили его (невозможно до C ++ 11). Если вы не предоставите свою собственную реализацию, компилятор предоставит ее вам.
Это главная причина правило трехЕсли у вас есть конструктор копирования, почти наверняка вам понадобится оператор присваивания и деструктор.
Да, вы получите доступ к генератору операторов присваивания по умолчанию компилятором, если вы его не предоставите.
Но в целом, если класс определяет одно из следующего, он, вероятно, должен явно определить все три
Я не знаю, что вы подразумеваете под присваиванием (в контексте компилятора). Итак, позвольте мне попробовать на примере. Допустим, у нас есть класс Test;
Test a,c; //default constructor would be called for both.
Test b = a; //copy constructor would be called for b as we are creating that object.
c = b; //assignment operator would be called for c as we are changing content's of c.
Итак, если класс Test содержит простые объекты, то не имеет значения, если вы определите ИЛИ, а не компилятор сделает для вас побитовое копирование. Но если ваш класс содержит указатели, то вы должны явно определить ваш конструктор копирования, оператор присваивания и деструктор.
Надеюсь, я достаточно ясно.