Подтвердить что ты не робот

Передает ли С++ объекты по значению или ссылке?

Простой вопрос, для которого я не мог найти ответ здесь.

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

void myFunction(type myVariable)
{
}

void main()
{
    myFunction(myVariable);
}

Для простых типов данных, таких как int, float и т.д., функция вызывается значением.

Но если myVariable является массивом, передается только начальный адрес (хотя наша функция является функцией вызова по значению).

Если myVariable является объектом, то передается только адрес объекта, а не создается копия и передается.

Итак, вернемся к вопросу. С++ передает объект по ссылке или значению?

4b9b3361

Ответ 1

Аргументы передаются по значению, если только сигнатура функции не указывает иначе:

  • в void foo(type arg), arg передается по значению независимо от того, является ли type простым типом, типом указателя или типом класса,
  • в void foo(type& arg), arg передается по ссылке.

В случае массивов переданное значение является указателем на первые элементы массива. Если вы знаете размер массива во время компиляции, вы также можете передать массив по ссылке: void foo(type (&arg)[10]).

Ответ 2

С++ всегда дает вам выбор: Все типы T (кроме массивов, см. ниже) могут передаваться по значению путем создания типа параметра T и передаваться по ссылке, тип параметра T &, reference-to- T.

Когда тип параметра явно не аннотируется как ссылка (type &myVariable), он всегда передается по значению независимо от конкретного типа. Для пользовательских типов тоже (для чего предназначен конструктор копирования). Также для указателей, хотя копирование указателя не копирует то, что указано.

Массивы немного сложнее. Массивы не могут передаваться по значению, типы параметров, такие как int arr[], на самом деле являются просто отличным синтаксисом для int *arr. Это не акт перехода к функции, которая создает указатель из массива, практически любую возможную операцию (исключая только несколько таких, как sizeof) делает это. Можно передать ссылку на массив, но это явно аннотируется как ссылка: int (&myArray)[100] (обратите внимание на амперсанд).

Ответ 3

С++ делает как пропуск по значению, так и пропуск через ссылочные парадигмы.

Ниже вы можете найти два примера использования.

http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

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

Когда вы передавали указатель в качестве параметра, вы сами реализуете пропуску по ссылочной парадигме, как в C. Поскольку, когда вы изменяете объект по указанному адресу, вы точно изменяете объект в функции вызывающего абонента.

Ответ 4

С++ передает аргументы, которые не являются указателями (int *) или ссылками (int &) по значению. Вы не можете изменить var вызывающего блока в вызываемой функции. Массивы - это указатели.