Класс без указателей на члены данных — конструктор копирования == оператор присваивания?

Если в вашем классе нет элементов данных, объявленных с использованием указателей, всегда ли конструктор копирования содержит тот же код, что и оператор присваивания? И если нет, то почему?

РЕДАКТИРОВАТЬ думаю, что мне нужен код, чтобы объяснить, что я имею в виду:

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;
//?
}

0

Решение

Нет, операторы присваивания членов участвуют:

#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;
}
3

Другие решения

Конструктор копирования работает с необработанной памятью.
Так что, если он ссылается на переменную-член, которая еще не установлена,
тогда он ссылается на неинициализированную память.

Оператор присваивания работает с памятью, уже содержащей построенный объект.
Таким образом, все переменные-члены инициализируются до запуска оператора присваивания.

Если ваш оператор присваивания не проверяет какие-либо переменные-члены,
тогда копия ctor-кода будет такой же.
Но учтите, что использование оператора присваивания переменной-члена в вашем операторе присваивания
может ссылаться на данные, о которых вы не знаете.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector