Способы передач по значению

Передача параметров по ссылке и по значению при вызове процедур и функций

Внимание! Материал данной статьи устарел. Рекомендуется использовать документацию к платформе «1С:Предприятие 8».

Встроенный язык 1С:Предприятия поддерживает два способа передачи параметров в процедуры и функции: передача параметров по ссылке и передача параметров по значению.

Передача параметров по ссылке

По умолчанию, во встроенном языке 1С:Предприятия 8 передача параметров в процедуры и функции осуществляется по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции будет отражаться на значении фактического параметра, переданного при вызове процедуры или функции.

Передача параметров по значению

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

Особенности передачи переменных различных типов данных по значению

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

Рассмотрим в качестве примера ситуацию, когда параметром процедуры, передаваемым по значению, является таблица значений. Внутри вызываемой процедуры ОбработатьТаблицу() создается новый экземпляр таблицы значений, в который добавляется три строки. Это никак не влияет на состояние таблицы значений Тз , переданной в качестве фактического параметра при вызове процедуры ОбработатьТаблицу() :

Рассмотрим в качестве примера ситуацию, когда параметром процедуры, передаваемым по значению, является таблица значений. Внутри вызываемой процедуры СвернутьТаблицу() таблица значений, переданная в качестве параметра при вызове процедуры, сворачивается:

Схематично изобразить происходящее при вызове процедуры СвернутьТаблицу(Тз) можно следующим образом:

(1) — вызов процедуры СвернутьТаблицу . В качестве фактического параметра указывается переменная Тз, хранящая ссылку на экземпляр таблицы значений;

(2) — из процедуры вызывается метод Свернуть таблицы значений;

(3) — формальный параметр ссылается на тот же самый экземпляр таблицы значений, что и фактический параметр (переменная Тз) — происходит свертка в экземпляре таблицы значений, на которую ссылается переменная Тз;

(4) — выходим из процедуры. Экземпляр таблицы значений, на которую ссылается переменная Тз, находится в свернутом состоянии.

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

Разница для всех типов при передаче параметра процедуры или функции по ссылке или по значению проявляется в присвоении фактическому параметру процедуры или функции нового значения. Вызов свойств и методов контекста фактического параметра, если таковые имеются, влияет на формальный параметр независимо от того, передается ли он по ссылке или по значению.

Читайте также:  Кредиты по способу взимания

Источник

Урок №97. Передача по значению

Обновл. 13 Сен 2021 |

По умолчанию, аргументы в C++ передаются по значению. Когда аргумент передается по значению, то его значение копируется в параметр функции. Например:

В первом вызове функции boo() аргументом является литерал 7 . При вызове boo() создается переменная y , в которую копируется значение 7 . Затем, когда boo() завершает свое выполнение, переменная y уничтожается.

Во втором вызове функции boo() аргументом является уже переменная x = 8 . Когда boo() вызывается во второй раз, переменная y создается снова и значение 8 копируется в y . Затем, когда boo() завершает свое выполнение, переменная y снова уничтожается.

В третьем вызове функции boo() аргументом является выражение x + 2 , которое вычисляется в значение 10 . Затем это значение передается в переменную y . При завершении выполнения функции boo() переменная y вновь уничтожается.

Таким образом, результат выполнения программы:

y = 7
y = 8
y = 10

Поскольку в функцию передается копия аргумента, то исходное значение не может быть изменено функцией. Это хорошо проиллюстрировано в следующем примере:

x = 7
y = 7
y = 8
x = 7

В начале функции main() x равно 7 . При вызове boo() значение x ( 7 ) передается в параметр y функции boo(). Внутри boo() переменной y сначала присваивается значение 8 , а затем у уничтожается. Значение x не изменяется, даже если изменить y .

Параметры функции, переданные по значению, также могут быть const. Тогда уже будет 100% гарантия того, что функция не изменит значение параметра.

Плюсы и минусы передачи по значению

Плюсы передачи по значению:

Аргументы, переданные по значению, могут быть переменными (например, x ), литералами (например, 8 ), выражениями (например, x + 2 ), структурами, классами или перечислителями (т.е. почти всем, чем угодно).

Аргументы никогда не изменяются функцией, в которую передаются, что предотвращает возникновение побочных эффектов.

Минусы передачи по значению:

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

Когда использовать передачу по значению:

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

Когда не использовать передачу по значению:

При передаче массивов, структур и классов.

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

Поделиться в социальных сетях:

Источник

11.2 – Передача аргументов по значению

Передача по значению

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

Рассмотрим следующий фрагмент:

При первом вызове foo() аргументом является литерал 5. Когда вызывается foo() , создается переменная y , и значение 5 копируется в y . Затем, когда foo() завершается, переменная y уничтожается.

Во втором вызове foo() аргументом является переменная x . x вычисляется для получения значения 6. Когда foo() вызывается во второй раз, переменная y создается снова, и значение 6 копируется в y . Затем, когда foo() завершается, переменная y уничтожается.

В третьем вызове foo() аргументом является выражение x + 1 . x + 1 вычисляется для получения значения 7, которое передается переменной y . Переменная y снова уничтожается, когда завершается foo() .

Таким образом, эта программа печатает:

Поскольку функции передается копия аргумента, исходный аргумент не может быть изменен функцией. Это показано в следующем примере:

Читайте также:  Правило девяток это способ

Этот фрагмент выводит:

В начале main переменная x равна 5. Когда вызывается foo() , значение x (5) передается в параметр y функции foo . Внутри foo() переменной y присваивается значение 6, а затем она уничтожается. Значение x не изменилось, даже если y был изменен.

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

Преимущества и недостатки передачи по значению

Преимущества передачи по значению:

  • Аргументы, передаваемые по значению, могут быть переменными (например, x ), литералами (например, 6), выражениями (например, x + 1 ), структурами и классами, а также перечислителями. Другими словами, практически всё.
  • Аргументы никогда не изменяются вызываемой функцией, что предотвращает побочные эффекты.

Недостатки передачи по значению:

  • Копирование структур и классов может значительно снизить производительность, особенно если функция вызывается много раз.

Когда использовать передачу по значению:

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

Когда не использовать передачу по значению:

  • При передаче структур или классов (включая std::array , std::vector и std::string ).

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

Источник

Передача по значению как механизм передачи параметров в Java

Узнайте, как передача параметров обрабатывается в Java для случаев примитивных и объектных типов.

Автор: baeldung
Дата записи

1. введение

Двумя наиболее распространенными способами передачи аргументов методам являются “передача по значению” и “передача по ссылке”. Различные языки программирования используют эти понятия по-разному. Что касается Java, все строго Pass-by-Value .

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

2. Pass-by-Value vs Pass-by-Reference

Давайте начнем с некоторых различных механизмов передачи параметров функциям:

Двумя наиболее распространенными механизмами в современных языках программирования являются “Передача по значению” и “Передача по ссылке”. Прежде чем мы продолжим, давайте сначала обсудим это:

2.1. Передача по значению

Когда параметр передается по значению, вызывающий и вызываемый метод работают с двумя различными переменными, которые являются копиями друг друга. Любые изменения одной переменной не изменяют другую.

Это означает, что при вызове метода параметры , передаваемые вызываемому методу, будут клонами исходных параметров. Любая модификация, выполненная в методе вызываемого абонента, не повлияет на исходные параметры в методе вызывающего абонента.

2.2. Пропуск по ссылке

Когда параметр передается по ссылке, вызывающий и вызываемый объект работают с одним и тем же объектом.

Это означает, что при передаче переменной по ссылке методу отправляется уникальный идентификатор объекта. Любые изменения членов экземпляра параметров приведут к изменению исходного значения.

3. Передача параметров в Java

Фундаментальными понятиями в любом языке программирования являются “значения” и “ссылки”. В Java примитивные переменные хранят фактические значения, в то время как непримитивы хранят ссылочные переменные, которые указывают на адреса объектов, на которые они ссылаются. Как значения, так и ссылки хранятся в памяти стека.

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

В случае примитивов значение просто копируется в память стека, которая затем передается вызываемому методу; в случае непримитивов ссылка в памяти стека указывает на фактические данные, которые находятся в куче. Когда мы передаем объект, ссылка в памяти стека копируется, и новая ссылка передается методу.

Читайте также:  Нарисовать каким способом образовано

Давайте теперь посмотрим на это в действии с помощью некоторых примеров кода.

3.1. Передача Примитивных Типов

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

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

Давайте попробуем разобраться в этом с помощью примера кода:

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

  1. Переменные ” x” и ” y” в основном методе являются примитивными типами, и их значения непосредственно хранятся в памяти стека
  2. Когда мы вызываем метод modify() , точная копия для каждой из этих переменных создается и хранится в другом месте в памяти стека
  3. Любое изменение этих копий влияет только на них и оставляет исходные переменные неизменными

3.2. Передача ссылок на объекты

В Java все объекты динамически хранятся в пространстве кучи под капотом. Эти объекты ссылаются на ссылки, называемые ссылочными переменными.

Объект Java, в отличие от примитивов, хранится в два этапа. Ссылочные переменные хранятся в памяти стека, а объект, на который они ссылаются, хранится в памяти кучи.

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

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

Давайте попробуем понять это с помощью примера кода:

Давайте проанализируем утверждения в приведенной выше программе. Мы передали объекты a и b в modify() метод, который имеет то же значение 1 . Первоначально эти ссылки на объекты указывают на два различных местоположения объектов в пространстве кучи:

Когда эти ссылки a и b передаются в методе modify () , он создает зеркальные копии этих ссылок a1 и b1 , которые указывают на одни и те же старые объекты:

В методе modify () , когда мы изменяем ссылку a1 , он изменяет исходный объект. Однако для ссылки b1, мы назначили новый объект. Таким образом, теперь он указывает на новый объект в памяти кучи.

Любое изменение, внесенное в b1 , ничего не отразит в исходном объекте:

4. Заключение

В этой статье мы рассмотрели, как обрабатывается передача параметров в случае примитивов и непримитивов.

Мы узнали, что передача параметров в Java всегда происходит по значению. Однако контекст меняется в зависимости от того, имеем ли мы дело с примитивами или объектами:

  1. Для примитивных типов параметры передаются по значению
  2. Для типов объектов ссылка на объект является передаваемым значением

Фрагменты кода, используемые в этой статье, можно найти на GitHub .

Источник

Оцените статью
Разные способы