Рекомендуємо, 2024

Вибір Редакції

Різниця між викликом за значенням і викликом за посиланням

У C ++ і Java існує два способи викликати функцію або метод. Перший - це виклик за значенням, а другий - виклик за посиланням. Метод виклику за значенням передає лише значення змінної до коду функції, і якщо є будь-яка зміна у значенні змінної всередині цієї функції, це не впливає на початкове значення цієї змінної. У методі call by reference ми передаємо цю змінну в аргумент, і зміна значення змінної також впливає на початкове значення цієї змінної. Основна відмінність між двома методами полягає в тому, що метод call by value передає значення змінної, а call by reference проходить адресу цієї змінної.

Діаграма порівняння:

Основа для порівнянняCall_By_ValueВиклик за посиланням
Основний
Копія змінної передається.Сама змінна передається.
ЕфектЗміна в копії змінної не змінює початкове значення змінної на стороні функції.Зміна змінної впливає також на значення змінної поза функцією.
Виклик параметрівfunction_name (variable_name1, variable_name2, ...);назва_функції (& змінний_назва1, і змінний_назва2, ...);
// у разі об'єкта
object.func_name (об'єкт);
Параметри отриманнятипу function_name (типу variable_name1, типу variable_name2, ...)
{. . }
введіть ім'я функції_назва (введіть * змінну_назва1, введіть * змінну_назва2, ...). . }
// у разі об'єкта
введіть назва_функції (class_type name_name)
{. . }
Стандартний викликПримітивний тип передається за допомогою "call by value".об'єкти неявно передаються за допомогою "call by reference".

Визначення вартості виклику

Якщо ви передаєте примітивний тип даних (ціле, символ, і рядок) до функції / методу, то тільки його "значення" передається до коду функції. Функція копіює це значення аргументу до "формального параметра" коду функції. Якщо існує будь-яка модифікація формального параметра у коді функції, вона не буде змінювати початкове значення аргументу, який використовується для виклику цієї функції.

Простими словами, якщо функція / метод називається підходом «виклик за значенням»; потім копія змінної передається до коду функції. Якщо код функції вносить будь-які зміни до значення в копії змінної, він не змінює початкове значення змінної.

Подивимося приклад, щоб коротко зрозуміти це.

 // приклад перевірки класу Java {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); }} клас call_by _value {public статичні void main (рядок args []) {int a = 12, b = 20; перевірити C = нова перевірка (); system.out.println ("значення" a "і" b "перед викликом функції" + a + "" + b); C.Зміна (a, b); // виклик за значенням. 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; temp = * x; * x = * y; * Y = temp; }} int main {int a = 10, b = 20; cout << "значення a, b перед викликом функції" << a << "" < 

Тепер давайте розглянемо «виклик за допомогою посилання», передавши «об'єкт» як аргумент, який неявно передається підходом «виклик за посиланням».

 class check {int a, b; check (int x, int b) {// об'єкт ініціалізований через цей конструкт a = x; b = y; } обмін порожнечами (перевірка ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {відкритий статичний void main (рядок args []) {check C = нова перевірка (20, 40); // ініціалізація об'єкта. system.out.println ("значення" ob.a "і" ob.b "перед викликом функції" + ob.a + "" + ob.b); C.обмін (C); // виклик за посиланням. system.out.println ("значення" ob.a "і" ob.b "перед викликом функції" + ob.a + "" + ob.b); }} // вихідне значення 'ob.a' і 'ob.b' перед викликом функції 20 40 значення 'ob.a' і 'ob.b' після виклику функції 40 20 

Ключові відмінності між викликом за значенням і посиланням за викликом

  1. Передача аргументу за допомогою підходу "call by value" передає лише копію цієї змінної, тому зміни, внесені до значення в копії цієї змінної, не впливають на початкове значення цієї змінної. У підході "call by reference" сама змінна передається як аргумент, тому змінюється на неї змінюється значення вихідної змінної.
  2. Якщо аргументи, що передаються, є примітивними типами даних, то вони просто 'call by value', але якщо посилання / адреси аргументів або об'єктів передаються, то функція викликається методом 'call by reference'.
  3. У 'call by value approach' аргументи передаються лише ім'ям змінних, тоді як у 'call by reference' підходять аргументи, що передаються, ім'я змінної по знаку '&', або об'єкт, який передається тільки його назвою.
  4. Отримання параметрів аргументу в підході «виклик за значенням» є ім'ям змінної разом з типом даних. У підході "call by reference" параметр прийому завжди є змінною покажчика поряд з типом даних, а у випадку об'єкта - це ім'я об'єкта разом з його типом класу.

Висновок:

C ++ і Java використовують обидва підходи залежно від того, що передається. Якщо ви хочете передати тільки значення змінної use'call by value 'підхід, і якщо ви хочете бачити зміну початкового значення змінної, то використовуйте' call by reference 'підхід.

Top