Кажется, что списки инициализаторов - это хорошая идея для конструкторов ваших классов и, как я предполагаю, также для конструктора копирования. Для оператора присваивания нужно назначить каждый член в теле функции. Рассмотрим следующий простой блок:
class Foo {
private:
int a,b;
public:
Foo(int c, int d) : a(c), b(d) {}
Foo(const Foo & X) : a(X.a), b(X.b) {}
Foo& operator=(const Foo& X) {
if (this == &X) return *this;
a = X.a;
b = X.b;
return *this;
}
};
Если класс имеет умеренное количество элементов данных, есть три места, где можно испортить различные назначения / инициализации. Под этим я подразумеваю, что если бы конструктор копирования выглядел так:
Foo(const Foo & X) : a(X.a), b(X.a) {}
или в операторе = отсутствует строка. Поскольку оператор присваивания и конструктор копирования часто имеют одинаковый эффект (в том смысле, что мы копируем члены из одного Foo в другой), могу ли я «повторно использовать» код из конструктора копирования или оператора присваивания или наоборот?
operator=
необходимо освободить перед копированием. - person Matteo Italia   schedule 09.11.2011