Я знаю, что когда вы вызываете функцию таким образом:
foo(MyClass a)
Предмет a
передается по значению, то есть копируется.
Мой вопрос, как это копируется?
скажем, мой класс не имеет конструктора копирования, поэтому, если он передается с использованием мелкой копии, чем
объект может измениться внутри функции?
Компилятор автоматически генерирует код для конструктора копирования и выполняет копирование по элементам. Конструктор копирования, который вызывает компилятор, делает копирование по элементам, которое действительно является мелкой копией.
Не рекомендуется передавать объект по значению, если существует указатель в вашем классе. Даже если указатель не существует, но существует дюжина других элементов данных, им потребуется много времени для копирования. Передайте его по ссылке и сделайте его const
если вы не хотите, чтобы его значение было изменено.
Есть две возможности.
В этом случае конструктор копирования по умолчанию MyClass::MyClass(MyClass const&)
будет использоваться. Это попытается скопировать построить все MyClass
член (рекурсивно, поскольку они могут иметь членов сами). Если какой-либо из этих членов не является копируемым конструктором, ваш конструктор копирования по умолчанию также потерпит неудачу (см. Следующий пункт).
delete
сделать это (в C ++ 11).В этом случае вы не сможете ничего передать этой функции, потому что компилятору потребуется доступ к конструктору копирования, который вы ему запретили. Это приведет к ошибкам времени компиляции.
Компилятор создает конструктор копирования по умолчанию.