2012-04-30 1 views
0

Мне действительно интересно, является ли передача «по-лучшему» семантически мудрой? Специально для примитивных типов он чувствует, как:семантические причины для передачи по ссылке

int x = 5; 
x = foo(x); 

является более естественным, чем

int x = 5; 
foo(x); 

Я первый подумал о коде нуждающейся возвращать коды ошибок, однако потом я понял, используя механизмы исключения всегда предпочтительнее (?) через это. Есть ли реальные причины, по которым вы хотели бы пройти по ссылке? - Теперь выходите из области действия.

ответ

1

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

Например, когда мы пишем sin(x), мы действительно хотим, чтобы наша функция sin для отображения значения (в) x другое значение, которое мы просто обозначим sin(x). Иногда мы хотим присвоить отображаемое значение другому имени, чтобы мы могли написать что-то вроде y := sin(x) и использовать y вместо sin(x).

Теперь, если sin бы этот параметр по ссылке, sin(x) будет означать, что значение x будет отображаться на sin(x) и неявным хранятся в x снова - так старое значение x будет потеряно!

Во многих случаях это было бы очень неприятно, потому что мы можем снова использовать «старый» x, поэтому нам придется скопировать его значение заранее.

Теперь рассмотрим другую сторону: ООП. Там вы хотите иметь объекты, например, автомобиль, и этот объект должен иметь возможность изменить. Например, автомобили могут двигаться (если они имеют газ), поэтому они могут менять свое положение; затраты на транспортировку газа, поэтому газовый бак будет истощаться с течением времени; вы можете открыть двери и т. д. и т. д.

Здесь мы не думаем отображать автомобиль на другой автомобиль (копия) с открытой дверцей или его бензобаком, но мы действительно думаем о автомобиль, но теперь с открытыми дверями.


Итак, еще раз коротко:

  • мимо значения хорошо, когда мы хотим, чтобы аргументы, чтобы не потерять свой первоначальный смысл - его наиболее полезным для отображения значений.

  • Передача справки хорошо, когда мы хотим, чтобы наше значение (которое мы здесь интерпретируем как объект) до изменение.


Так семантический совершенно ясно, что вы обычно хотите использовать передачу по значению/передачи по ссылке на, но есть некоторые проблемы, одна может быть с прохождением по значению:

Если ваш object является ресурсом , тогда передача этого ресурса по значению (вероятно) означает, что вы выделите второй ресурс! Иногда это просто невозможно - например, подумайте о сетевых подключениях (TCP). Когда у вас уже есть один, его невозможно открыть на одном и том же порту, разделив контекст в уже открытом соединении. Поэтому в таких случаях у вас действительно нет выбора, кроме как передать свое сетевое соединение (сокет, поток данных, что угодно) по ссылке.

 Смежные вопросы

  • Нет связанных вопросов^_^