конструктор копирования — аргумент функции C ++, передаваемый по значению

Я знаю, что когда вы вызываете функцию таким образом:

foo(MyClass a)

Предмет a передается по значению, то есть копируется.

Мой вопрос, как это копируется?
скажем, мой класс не имеет конструктора копирования, поэтому, если он передается с использованием мелкой копии, чем
объект может измениться внутри функции?

2

Решение

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

Не рекомендуется передавать объект по значению, если существует указатель в вашем классе. Даже если указатель не существует, но существует дюжина других элементов данных, им потребуется много времени для копирования. Передайте его по ссылке и сделайте его const если вы не хотите, чтобы его значение было изменено.

11

Другие решения

Есть две возможности.

Во-первых: вы не сделали уточнить конструктор копирования.

В этом случае конструктор копирования по умолчанию MyClass::MyClass(MyClass const&) будет использоваться. Это попытается скопировать построить все MyClassчлен (рекурсивно, поскольку они могут иметь членов сами). Если какой-либо из этих членов не является копируемым конструктором, ваш конструктор копирования по умолчанию также потерпит неудачу (см. Следующий пункт).

Второе: вы объявили конструктор копирования закрытым или фактически deleteсделать это (в C ++ 11).

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

5

Компилятор создает конструктор копирования по умолчанию.

1