Это действительный Copy Ctor? - PullRequest
3 голосов
/ 11 марта 2010

Интересно, что-то не так с функцией конструктора копирования ниже?

class A
{
   private:
      int m;
   public:
      A(A a){m=a.m}
}

Ответы [ 3 ]

17 голосов
/ 11 марта 2010

Две вещи:

  • Конструкторы копирования должны принимать ссылки в качестве параметров, в противном случае они бесконечно рекурсивны (фактически язык не позволяет вам объявлять такие конструкторы)

  • Он не делает ничего, что не делает ctor по умолчанию, но делает это плохо - вы должны по возможности использовать списки инициализации в ctor копии. И если ctor по умолчанию копирует то, что вы хотите, не поддавайтесь искушению написать версию самостоятельно - вы, вероятно, только ошибетесь, и вам нужно будет поддерживать ее.

7 голосов
/ 11 марта 2010

Там 3 проблемы.

Во-первых, вы забыли ";" в конце m = a.m, чтобы ваш код не компилировался.

Во-вторых, передача по ссылке предпочтительнее в большинстве случаев, когда вы передаете что-то с размером больше, чем размер регистра на вашей платформе.

В-третьих, поскольку вы не собираетесь менять исходный объект, лучше иметь его с const. Итак, наконец, вот что мы имеем:

A (const A & a): m (a.m) {}

5 голосов
/ 11 марта 2010

Проблема в том, что конструктор копирования вызывается для параметра, переданного по значению. Таким образом, вы должны передать параметр конструктора копирования по ссылке (обычно это константная ссылка), если вы не хотите не завершающую рекурсию. Незначительная проблема заключается в том, что вы не используете список инициализации, который предпочтительнее для инициализации члена. Исправление обеих проблем:

A(A const& a)
  : m(a.m)
{}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...