Оператор присваивания - Самоназначение - PullRequest
13 голосов
/ 10 апреля 2011

Предусматривает ли сгенерированный компилятором оператор присваивания защиту от самостоятельного присваивания?

class T {

   int x;
public:
   T(int X = 0): x(X) {}
};

int main()
{
   T a(1);
   a = a;
}

Всегда ли мне нужно защищать от самоназначения, даже если члены класса не имеют указатель типа?

Ответы [ 3 ]

12 голосов
/ 10 апреля 2011

Сгенерировал ли компилятор оператор присваивания для защиты от самостоятельного присваивания?

Нет, это не так. Он просто выполняет пошаговое копирование, где каждый член копируется своим собственным оператором присваивания (который также может быть объявлен программистом или сгенерирован компилятором).

Всегда ли мне нужно защищаться от самостоятельного назначения, даже если члены класса не имеют указатель типа?

Нет, если нет, если все атрибуты вашего класса (и, следовательно, их) являются POD-типами .

При написании собственных операторов присваивания вы, возможно, захотите проверить самопредставление, если хотите защитить свой класс от будущего, даже если они не содержат указателей и так далее . Также рассмотрим идиома копирования и обмена .

4 голосов
/ 10 апреля 2011

Это легко проверить эмпирически:

#include <iostream>
struct A {
  void operator=(const A& rhs) {
    if(this==&rhs) std::cout << "Self-assigned\n";
  }
};

struct B {
  A a;
};

int main()
{
  B b;
  b = b;
}
0 голосов
/ 14 июня 2012
class T {
    int x;
public:
    T(int X = 0): x(X) {}
// prevent copying
private:
    T& operator=(const T&);
};
...