2013-06-05 2 views
3

У меня есть вопрос, связанный с реализацией оператора = в C++. Если я правильно помню, есть два способа реализации = в классе: один должен перегружать = явно, и, например:где я должен реализовать оператор = в C++

class ABC 
{ 
    public: 
     int a; 
     int b; 
     ABC& operator = (const ABC &other) 
     { 
      this->a = other.a; 
      this->b = other.b; 
     } 
} 

, а другой, чтобы определить = неявно. Например:

class ABC 
    { 
     public: 
      int a; 
      int b; 
      ABC(const ABC &other) 
      { 
      a = other.a; 
      b = other.b; 
      } 
    } 

Мой вопрос заключается в следующем:

1) Нужно реализовать = явно и неявно? 2) Если требуется только один из них, какая реализация предпочтительна?

Спасибо!

+3

Это две разные вещи. Первый пример имеет оператор присваивания. Второй - конструктор копирования. Это не имеет никакого значения, потому что сгенерированные версии компилятора достаточно хороши. – juanchopanza

+5

Возможно, вы захотите прочитать о [правиле трех] (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29). –

ответ

3

Если вы хотите настроить задание/копию, вы должны реализовать как:

  • operator= используется для выполнения заданий, например: ABC a; ABC b; a = b;
  • ABC::ABC(const ABC &other) используется для копий, например: ABC a; ABC b(a);.

Также очень вероятно, что вы захотите реализовать конструктор по умолчанию и деструктор тоже. Вы можете больше узнать о rule of three.

+3

На самом деле, в этом случае вам не нужно реализовывать. – juanchopanza

+1

Предполагая, что OP хочет настроить его за тривиальную реализацию. – slaphappy

+0

И после того, как вы прочитали о правиле трех, читайте о [правиле пять] (http://stackoverflow.com/questions/4782757/rule-of-three-becomes-rule-of-five-with-c11) , –

1

В вашем случае вам не нужно реализовывать построение копии или назначение копии, поскольку компилятор автоматически генерирует эти функции-члены для вас. Сгенерированные функции просто вызовут конструктор копирования или оператор назначения копирования соответственно для каждого элемента данных.

Вам нужно только реализовать функции, если вы хотите настроить поведение. Кстати, если вы реализуете конструктор копирования, то оператор присваивания копий будет по-прежнему иметь такое же поведение по умолчанию, как описано выше, и наоборот. Следовательно, если вы настроите один из двух, то вам, вероятно, придется настроить и другой. И, возможно, деструктор. Это называется rule of three. В большинстве случаев поведение по умолчанию будет прекрасным.

4

Первое, что вы показываете, это оператор назначения , а второй - конструктор копирования . Это разные функции, выполняющие разные вещи. (а именно, ctor устанавливает объект, который рождается и op = изменяет состояние существующего объекта, чтобы он соответствовал состоянию другого объекта.)

С некоторой удачей (с помощью дизайна) вы не применяете ни один из них, но оставляете это на язык, чтобы создать их. Если вы используете разумных членов и базовые классы, это произойдет.

Если вам нужно пойти их реализации (проверка в два раза это действительно так!) Вы, вероятно, нужны оба из них, см Rule of 3

Смежные вопросы