2013-04-23 3 views
1

Копировальный конструктор, глубокая копия, постоянная ссылкаКопировальный конструктор, глубокая копия, константа Ссылка

Q. Что касается управления памятью.

Конструктор копирования для класса A имеет вид A (const A & a) Почему параметр передается по ссылке? Объясните, почему мы не можем определить конструктор формы A (A a)

Ответ. Три причины, почему мы делаем так:

  1. Постоянная ссылка при передаче объекта в качестве параметра является более эффективным
  2. Если мы проходим А (А а) без сопзЬ модификатора объект, который не должен быть изменен мог возможно быть изменена по ошибке
  3. мы так, чтобы мы могли сделать глубокую копию

Эти три причины являются правильными?

Пожалуйста, дайте мне знать. Спасибо,

+0

Ум, как насчет этого: 'MyClass obj (MyClass());' –

+0

Ваша вторая причина: "A (A a)" без модификатора const ": посмотрите еще раз. Модификатор 'const' был не единственным, что вы лишили этого. – WhozCraig

ответ

3
A(A a) 

нужно будет генерировать копию a, поскольку она передается по значению. Поэтому нам нужно вызвать конструктор копирования для копирования. Однако в этом случае конструктор копирования не был определен, вы не можете создать копию a, поэтому он должен быть передан по ссылке.

У нас есть формат:

A(const A& a) 

Обратите внимание, что: постоянная ссылка на самом деле ссылка на константу. Это означает, что мы передаем объект A по ссылке, и мы не должны изменять a при создании копии a.

Чем важнее то, что конструктор копирования принимает const-ссылку, так это то, что временный объект не может связываться с неконстантной ссылкой. Поэтому конструктор копирования должен ссылаться на объект const, чтобы иметь возможность делать копии временных объектов.