Рекомендуем, 2020

Выбор редакции

Разница между звонком по значению и звонком по ссылке

В C ++ и Java есть два способа вызвать функцию или метод. Первый - «вызов по значению», а второй - «вызов по ссылке». Метод вызова по значению передает только значение переменной в код функции, и, если есть какое-либо изменение в значении переменной внутри этой функции, это не влияет на исходное значение этой переменной. При вызове методом ссылки мы передаем переменную в качестве аргумента, и изменение значения переменной также влияет на исходное значение этой переменной. Основное различие между этими двумя методами заключается в том, что метод call by value передает значение переменной, а call by reference передает адрес этой переменной.

Сравнительная таблица:

Основа для сравненияCall_By_ValueЗвонок по ссылке
основной
Копия переменной передается.Сама переменная передается.
эффектИзменение в копии переменной не изменяет исходное значение переменной вне функции.Изменение в переменной также влияет на значение переменной вне функции.
Параметры вызоваимя_функции (имя_переменной1, имя_переменной2, ...);имя_функции (& имя_переменной1, & имя_переменной2, ...);
// в случае объекта
object.func_name (object);
Получение параметровтип имя_функции (тип имя_переменной1, тип имя_переменной2, ...)
{., }
тип имя_функции (тип * имя_переменной1, тип * имя_переменной2, ....) {., }
// в случае объекта
тип имя_функции (тип_класса_объект_класса)
{., }
Вызов по умолчаниюпримитивный тип передается с использованием «вызова по значению».объекты неявно передаются с использованием «вызова по ссылке».

Определение Call по значению

Если вы передаете примитивный тип данных (целое число, символ и строку) в функцию / метод, то только его «значение» передается в код функции. Функция копирует это значение аргумента в «формальный параметр» кода функции. Если в коде функции есть какое-либо изменение формального параметра, оно не изменит первоначального значения аргумента, который используется для вызова этой функции.

Проще говоря, если функция / метод вызывается методом «вызов по значению»; затем копия переменной передается в код функции. Если код функции вносит какие-либо изменения в значение в копии переменной, он не меняет первоначальное значение переменной.

Давайте посмотрим пример, чтобы понять это вкратце.

 // пример в классе Java check {void change (int i, int j) {i = i * i; j = j / 2; system.out.println («значение параметра внутри функции»); system.out.println ("значение 'i', которое принимает значение аргумента 'a'" + i); system.out.println («значение j, которое принимает значение аргумента b» + j); }} class call_by _value {public static void main (string args []) {int a = 12, b = 20; проверка C = новая проверка (); system.out.println ("значение 'a' и 'b' перед вызовом функции" + a + "" + b); C.change (а, б); // вызов по значению. system.out.println ("значение 'a' и 'b' после вызова функции" + a + "" + b); }} // выводим значения 'a' и 'b' перед вызовом функции 12 20 значение параметра внутри значения функции 'i', которое принимает значение аргумента 'a' 144, значение 'j', которое принимает значение аргумент 'b' 10 значение 'a' и 'b' после вызова функции 12 20 

Определение вызова по ссылке

Метод Call by Reference передает ссылку / адрес аргумента в код функции. Поскольку адрес аргумента передается в код функции, формальный параметр, принимающий этот адрес, будет переменной-указателем. Теперь, когда код функции получил адрес аргумента, изменение значения аргумента также изменит исходное значение аргумента.

В C ++ и Java очень распространено передавать объект в функцию / метод, а объект всегда передается по его ссылке. Изменения, внесенные в объект внутри функции / метода, влияют на объект, используемый для вызова этой функции / метода.

Следующий фрагмент показывает правильный способ «вызова по ссылке».

 // пример в классе C ++ swap {void swap (int * x, int * y) {int temp; Темп = * х; * Х = * у; * Y = темп; }} int main {int a = 10, b = 20; cout << "значение a, b перед вызовом функции" << a << "" < 

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

 проверка класса {int a, b; check (int x, int b) {// объект, инициализированный через этот конструктор a = x; б = у; } void exchange (проверьте ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (string args []) {check C = new check (20, 40); // инициализация объекта. system.out.println ("значение ob.a" и "ob.b" перед вызовом функции "+ ob.a +" "+ ob.b); C.exchange (С); // вызов по ссылке. system.out.println ("значение ob.a" и "ob.b" перед вызовом функции "+ ob.a +" "+ ob.b); }} // выводим значения ob.a и ob.b перед вызовом функции 20 40 значения ob.a и ob.b после вызова функции 40 20 

Ключевые различия между звонком по значению и звонком по ссылке

  1. Передача аргумента с использованием подхода «вызов по значению» только передает копию этой переменной, поэтому изменения, внесенные в значение в копии этой переменной, не влияют на исходное значение этой переменной. В подходе «вызов по ссылке» сама переменная передается в качестве аргумента, поэтому изменения в ней изменяют значение исходной переменной.
  2. Если переданные аргументы являются примитивными типами данных, они просто являются «вызовом по значению», но если передаются ссылки / адреса аргументов или объектов, то функция вызывается методом «вызов по ссылке».
  3. В подходе «вызов по значению» передаваемые аргументы - это только имя переменных, тогда как при подходе «вызов по ссылке» переданные аргументы - это имя переменной вдоль знака «&» или объект, который передается только по имени.
  4. При получении параметров аргумента в подходе «вызов по значению» указывается имя переменной и ее тип данных. В подходе «вызов по ссылке» принимающий параметр всегда является переменной-указателем вместе с типом данных, а в случае объекта это имя объекта вместе с его типом класса.

Заключение:

C ++ и Java используют оба подхода в зависимости от того, что передано. Если вы хотите передать только значение переменной, используйте подход «вызов по значению» и если вы хотите увидеть изменение исходного значения переменной, используйте подход «вызов по ссылке».

Top