Top.Mail.Ru
Ответы

В чем отличии передачи парметров по ссылке от передачи параметров по значению?

По дате
По рейтингу
Аватар пользователя
Гуру
14лет

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

Аватар пользователя
Гуру
14лет

>>Если в двух словах, то передача параметра по значению передает лишь информацию о значении функции.
По смыслу как-то коряво получилось.. информацию о значении параметра, а не функции:) Под "умирает" имеется в виду, что это локальное значение и за рамки функции оно не выходит. Собственно по завершению работы программы локальные значения стираются.

Аватар пользователя
Мудрец
14лет

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

Аватар пользователя
Профи
14лет

если передать переменную по ссылке и изменить, то в вызывающем методе она тоже останется измененной.
если по значению - останется неизменной

Аватар пользователя
14лет

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

Передача параметра по ссылке
Передача параметра по ссылке означает что копируется не само значение, а адрес исходной переменной (как в случае передачи параметра по адресу) , однако синтаксис используется такой, чтобы программисту не приходилось использовать операцию разыменования и он мог иметь дело непосредственно со значением, хранящимся по этому адресу (как в случае передачи параметра по значению) .
Передача по ссылке позволяет избежать копирования всей информации, описывающей состояние объекта (а это может быть существенно больше чем sizeof(int)) и является необходимой для конструктора копирования.
Если функция возвращает значение по ссылке (например, в виде «return *this;»), то её вызов можно использовать слева от оператора присваивания (смотри также L-выражение) .
В случае если передача по ссылке используется именно как средство увеличения быстродействия, но изменение параметра нежелательно, можно использовать передачу по ссылке константного объекта.
Таким образом можно ожидать, что примерная программа напечатает (если закоментировать ошибочную строку) «0010 022 233 333».
Некоторые языки (или их диалекты) не поддерживают передачу по ссылке, некоторые наоборот - передают параметры исключительно по ссылке, что порождает риск непреднамеренного изменения контекста вызывающей функции.

Источник: вики


Видео по теме