
Сравнительная таблица:
Основа для сравнения | 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Ключевые различия между звонком по значению и звонком по ссылке
- Передача аргумента с использованием подхода «вызов по значению» только передает копию этой переменной, поэтому изменения, внесенные в значение в копии этой переменной, не влияют на исходное значение этой переменной. В подходе «вызов по ссылке» сама переменная передается в качестве аргумента, поэтому изменения в ней изменяют значение исходной переменной.
- Если переданные аргументы являются примитивными типами данных, они просто являются «вызовом по значению», но если передаются ссылки / адреса аргументов или объектов, то функция вызывается методом «вызов по ссылке».
- В подходе «вызов по значению» передаваемые аргументы - это только имя переменных, тогда как при подходе «вызов по ссылке» переданные аргументы - это имя переменной вдоль знака «&» или объект, который передается только по имени.
- При получении параметров аргумента в подходе «вызов по значению» указывается имя переменной и ее тип данных. В подходе «вызов по ссылке» принимающий параметр всегда является переменной-указателем вместе с типом данных, а в случае объекта это имя объекта вместе с его типом класса.
Заключение:
C ++ и Java используют оба подхода в зависимости от того, что передано. Если вы хотите передать только значение переменной, используйте подход «вызов по значению» и если вы хотите увидеть изменение исходного значения переменной, используйте подход «вызов по ссылке».