Возможно, для примитивных типов это более естественно передавать их по значению. Просто глядя на математику, мы все понимаем ценности и знаем, что мы подразумеваем под , отображая значения другим значениям.
Например, когда мы пишем sin(x)
, мы действительно хотим, чтобы наша функция sin
для отображения значения (в) x
другое значение, которое мы просто обозначим sin(x)
. Иногда мы хотим присвоить отображаемое значение другому имени, чтобы мы могли написать что-то вроде y := sin(x)
и использовать y
вместо sin(x)
.
Теперь, если sin
бы этот параметр по ссылке, sin(x)
будет означать, что значение x
будет отображаться на sin(x)
и неявным хранятся в x
снова - так старое значение x
будет потеряно!
Во многих случаях это было бы очень неприятно, потому что мы можем снова использовать «старый» x
, поэтому нам придется скопировать его значение заранее.
Теперь рассмотрим другую сторону: ООП. Там вы хотите иметь объекты, например, автомобиль, и этот объект должен иметь возможность изменить. Например, автомобили могут двигаться (если они имеют газ), поэтому они могут менять свое положение; затраты на транспортировку газа, поэтому газовый бак будет истощаться с течением времени; вы можете открыть двери и т. д. и т. д.
Здесь мы не думаем отображать автомобиль на другой автомобиль (копия) с открытой дверцей или его бензобаком, но мы действительно думаем о автомобиль, но теперь с открытыми дверями.
Итак, еще раз коротко:
мимо значения хорошо, когда мы хотим, чтобы аргументы, чтобы не потерять свой первоначальный смысл - его наиболее полезным для отображения значений.
Передача справки хорошо, когда мы хотим, чтобы наше значение (которое мы здесь интерпретируем как объект) до изменение.
Так семантический совершенно ясно, что вы обычно хотите использовать передачу по значению/передачи по ссылке на, но есть некоторые проблемы, одна может быть с прохождением по значению:
Если ваш object является ресурсом , тогда передача этого ресурса по значению (вероятно) означает, что вы выделите второй ресурс! Иногда это просто невозможно - например, подумайте о сетевых подключениях (TCP). Когда у вас уже есть один, его невозможно открыть на одном и том же порту, разделив контекст в уже открытом соединении. Поэтому в таких случаях у вас действительно нет выбора, кроме как передать свое сетевое соединение (сокет, поток данных, что угодно) по ссылке.