2015-12-19 3 views
0

Допустим, у нас есть два класса в C++:Простой конструктор копирования в C++

Class A{ 
     public: 
      A(); 
     private: 
      int k; 
}; 

Class B{ 
     public: 
      B(); 
     private: 
      A a; 
}; 

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

Как я мог бы написать копию CTOR из B (это его копия т е р в самом деле?) Для инициализации a (который имеет тип Class A) с другим объектом экземпляра A (пусть это будет a_inst), которые уже были определены и инициализированы раньше?

Другими словами, какой будет код для ctor B()?

+0

'B (const B & src): a (src.a) {}' – Rabbid76

+3

вы не делаете, в таких случаях, как ваш, проще просто удалить все конструкторы и дать компилятору сгенерировать их все для вас (https : //rmf.io/cxx11/rule-of-zero/). – Mgetz

+0

Вам не нужен конструктор-копир, если ваш класс не имеет дело с каким-либо ресурсом. В вашем случае это не просто позволяет компилятору обрабатывать все для вас. Прочтите https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming) для получения дополнительной информации. – 4386427

ответ

1

Я хотел бы сделать это как этот

B(const A &paramA) : a(paramA) {} 
B(A &&paramA) : a(move(paramA)) {} 
B(const B &src) : a(src.a) {} 

Beside конструктора копией Я предлагаю также два дополнительных конструкторы, которые могут быть проинициализирован л стоимость экземпляров и другие для г-значения экземпляров. В зависимости от семантики A вам может не понадобиться версия перемещения.

+0

Я бы пропустил часть движения и только поместил ее туда, если она действительно улучшает производительность. В противном случае это просто усложняет код. И ваша последняя строка не должна компилироваться, поскольку у нее нет конструктора, который принимает аргумент B. –

+0

@TobiasLangner исправил проблему. Благодарю. Что касается перегрузки r-значения, по причине, о которой вы упоминаете, я добавил заявление об отказе от ответственности. Но из моего предыдущего опыта работы с классами, которые выглядели как один OP, в конечном итоге потребовалась перегрузка значения r. – bashrc

+0

конструктор копирования B не должен быть необходим, поскольку построенный по умолчанию вариант должен быть достаточным в этом случае. Это уменьшает источники ошибок при рефакторинге. –

0
Class A{ 
     public: 
      A(); 
      A(const A& obj); 
     private: 
      int k; 
}; 

Class B{ 
     public: 
      B(); 
      B(const B& obj) 
      : a(obj.a) { } 
      B(const A& obj) 
      : a(obj) { } 
     private: 
      A a; 
};