Если в вашем классе нет элементов данных, объявленных с использованием указателей, всегда ли конструктор копирования содержит тот же код, что и оператор присваивания? И если нет, то почему?
РЕДАКТИРОВАТЬ думаю, что мне нужен код, чтобы объяснить, что я имею в виду:
class A{
public:
A();
A(const A& a);
A& operator=(const A& a);
private:
int a;
double b;
};
//Copy constructor
A::A(const A& src){
a = src.a;
b = src.b;
}
//Assignment operator
A& A::operator=(const A& src){
//Because none of the data members are pointers- the code in here
//would be the same as the copy constructor?
//Could I do:
a = src.a;
b = src.b;
//?
}
Нет, операторы присваивания членов участвуют:
#include <iostream>
#include <stdexcept>
struct X {
X() { std::cout << "construct" << std::endl; }
X(const X&) { std::cout << "copy construct" << std::endl; }
X& operator = (const X&) {
throw std::logic_error("assignment");
}
};
struct Y {
X x;
};
int main() {
Y y0;
Y y1(y0);
y1 = y0;
return 0;
}
Конструктор копирования работает с необработанной памятью.
Так что, если он ссылается на переменную-член, которая еще не установлена,
тогда он ссылается на неинициализированную память.
Оператор присваивания работает с памятью, уже содержащей построенный объект.
Таким образом, все переменные-члены инициализируются до запуска оператора присваивания.
Если ваш оператор присваивания не проверяет какие-либо переменные-члены,
тогда копия ctor-кода будет такой же.
Но учтите, что использование оператора присваивания переменной-члена в вашем операторе присваивания
может ссылаться на данные, о которых вы не знаете.