Когда вызывается оператор присвоения копии?
Когда я читал о конструкторе копирования и конструкторе назначения копирования, я понял, что оба передают свои свойства друг другу, и что оба они неявно объявляются компилятором (если он не определен). Таким образом, оба должны существовать независимо от того, делают ли они что-то полезное или нет.
Затем я проверил этот код:
#include <iostream>
using namespace std;
class Test {
public:
Test () {
cout << "Default constructor" << endl;
}
Test (const Test& empty) {
cout << "Copy constructor" << endl;
}
Test& operator=(const Test& empty) {
cout << "Copy assignment operator" << endl;
}
private:
};
int main () {
Test a; // Test default constructor
Test b (a); // Test copy constructor
Test c = b; // Test copy assignment constructor
system ("pause");
return 0;
}
Но, похоже, оператор присваивания копии вообще не вызывается. Я пытался с тремя условиями:
Все включено. Распечатывает:
// Default constructor // Copy constructor // Copy constructor # Why not prints out "Copy assignment operator"?
Утилизировать оператор присваивания копии просто скопировать конструктор. Распечатывает:
// Default constructor // Copy constructor // Copy constructor # Why it's printed out even though I didn't define it?
Без копирования конструктор просто скопировать оператор присваивания. Распечатывает:
// Default constructor # Why "Copy assignment operator" is not printed out?
Единственный конструктор. Распечатывает:
// Default constructor # Understandable
Так что, как будто компилятору даже не важно, определяю я оператор копирования или нет. Ни в одном из четырех приведенных выше примеров не выводится "Оператор копирования". Так, когда это назвали, если это действительно существует и имеет значение?
1 ответ
Test c = b
это инициализация, а не присвоение.
Если вы сделали это:
Test c;
c = b;
Тогда он вызвал бы оператор присваивания копии.