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

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

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

void myFunction(type myVariable)
{
}

void main()
{
myFunction(myVariable);
}

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

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

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

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

39

Решение

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

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

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

34

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

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

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

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

11

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

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

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

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

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

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

3

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

-7
По вопросам рекламы [email protected]