Рецоммендед, 2020

Избор Уредника

Разлика између вредности по позиву и позива по позиву

У Ц ++ и Јава постоје два начина за позивање функције или методе. Први је “цалл би валуе”, а други “цалл би референце”. Метод позива по вредности прослеђује само вредност променљиве коду функције, и ако постоји било каква промена вредности променљиве унутар те функције, она не утиче на оригиналну вредност те променљиве. У методи цалл би референце проследимо саму променљиву у аргумент, а промена вредности променљиве такође утиче на оригиналну вредност те променљиве. Главна разлика између оба метода је да метода цалл би валуе прослеђује вредност променљиве, а позив референцом прослеђује адресу те променљиве.

Табела за упоређивање:

Основа за поређењеЦалл_Би_ВалуеЦалл би Референце
Басиц
Копија променљиве је прослеђена.Сама варијабла је прошла.
ЕффецтПромена у копији променљиве не мења првобитну вредност променљиве са стране функције.Промена у променљивој такође утиче на вредност променљиве ван функције.
Позивање параметарафунцтион_наме (вариабле_наме1, вариабле_наме2, ...);име_ функције (& променљива_име1, и променљива_име2, ...);
// у случају објекта
објецт.фунц_наме (објецт);
Параметри примањаупишите име_ функције (упишите вариабле_наме1, упишите вариабле_наме2, ...)
{. . }
упишите име_функције (упишите * варијабле_име1, упишите * варијабла_име2, ...). . }
// у случају објекта
упишите име функције (цласс_типе име_објекта)
{. . }
Подразумевани позивпримитивни тип се прослеђује помоћу "цалл би валуе".објекти су имплицитно прослеђени помоћу "цалл би референце".

Дефиниција вредности по позиву

Ако проследите примитивни тип података (цео број, карактер и стринг) функцији / методи, онда се само њена "вредност" прослеђује функцијском коду. Функција копира ту вредност аргумента у 'формални параметар' функције кода. Ако постоји било каква модификација формалног параметра у функцијском коду, он неће модификовати оригиналну вредност аргумента који се користи за позивање те функције.

Једноставним речима, ако се функција / метода назива приступом по позиву; тада се копија променљиве прослеђује коду функције. Ако шифра функције уноси промене у вредност у копији променљиве, она не мења оригиналну вредност променљиве.

Да видимо пример да ово кратко разумемо.

 // пример у Јава цласс цхецк {воид цханге (инт и, инт ј) {и = и * и; ј = ј / 2; систем.оут.принтлн ("вредност параметра унутар функције"); систем.оут.принтлн ("вредност 'и' која прихвата вредност аргумента 'а'" + и); систем.оут.принтлн ("вредност 'ј' која прихвата вредност аргумента 'б'" + ј); }} цласс цалл_би _валуе {публиц статиц воид маин (стринг аргс []) {инт а = 12, б = 20; цхецк Ц = нова провера (); систем.оут.принтлн ("вредност" а "и" б "пре позива функције" + а + "" + б); Ц. промена (а, б); // позив по вредности. систем.оут.принтлн ("вредност" а "и" б "после позива функције" + а + "" + б); }} // излазна вредност 'а' и 'б' пре него што функција позове 12 20 вредност параметра унутар вредности функције 'и' која прихвата вредност аргумента 'а' 144 вредности 'ј' који прихвата вредност од аргумент 'б' 10 вредност 'а' и 'б' након позива функције 12 20 

Дефиниција позива по референци

Цалл би Референце метода прослеђује референцу / адресу аргумента функцијском коду. Како се адреса аргумента просљеђује коду функције, формални параметар који прихваћа ту адресу био би варијабла 'показивача'. Сада, пошто је функција функције добила адресу аргумента, модификација вредности аргумента ће такође модификовати првобитну вредност аргумента.

У Ц ++ и Јава, веома је уобичајено да се објект проследи функцији / методи, а објекат се увек прослеђује његовом референцом. Промене на објекту унутар функције / метода утичу на објекат који се користи за позивање те функције / методе.

Следећи фрагмент показује исправан начин да се 'позове по референци'.

 // пример у Ц ++ цласс свап {воид свап (инт * к, инт * и) {инт темп; темп = * к; * к = * и; * И = темп; }} маин маин {инт а = 10, б = 20; цоут << "вредност а, б пре позива функције" << а << "" < 

Сада хајде да разговарамо о 'позиву по референци' тако што проследимо 'објекат' као аргумент, који је имплицитно прослеђен од стране приступа 'позив по референци'.

 цласс цхецк {инт а, б; цхецк (инт к, инт б) {// објекат иницијализован кроз овај конститутор а = к; б = и; } размена воид (провера об) {об.а = а * 2; об.б = б / 2; }} цласс маин_цласс {публиц статиц воид маин (стринг аргс []) {цхецк Ц = нова провера (20, 40); // иницијализација објеката. систем.оут.принтлн ("вредност" об.а "и" об.б "пре позива функције" + об.а + "" + об.б); Ц.екцханге (Ц); // позив по референци. систем.оут.принтлн ("вредност" об.а "и" об.б "пре позива функције" + об.а + "" + об.б); }} // излазна вредност 'об.а' и 'об.б' пре позива функције 20 40 'об.а' и 'об.б' након позива функције 40 

Кључне разлике између вредности по позиву и позива по позиву

  1. Преношење аргумента помоћу приступа 'цалл би валуе' прослеђује само копију те променљиве, тако да промене у вредности у копији те променљиве не утичу на оригиналну вредност те променљиве. У приступу 'позив по референци' сама варијабла се прослеђује као аргумент, тако да се мења и мења вредност оригиналне променљиве.
  2. Ако су аргументи прошли примитивни типови података, они су једноставно 'цалл би валуе', али ако су референце / адресе аргумената или објеката прослеђене онда се функција зове 'цалл би референце' методом.
  3. У 'цалл би валуе приступу' аргументи су само име варијабли, док се у 'цалл би референце' приступају аргументима који су прослеђени, име варијабле дуж '&' знака, или објекат који је прослеђен само његовим именом.
  4. Примање параметара аргумента у приступу 'цалл би валуе' је име променљиве заједно са типом података. У 'цалл би референце' приступу, параметар примања је увијек варијабла показивача заједно са типом података, ау случају објекта је име објекта заједно са типом класе.

Закључак:

Ц ++ и Јава користе оба приступа у зависности од тога шта је прошло. Ако желите да прођете само вредност варијабле усе'цалл би валуе 'приступ и ако желите да видите промену оригиналне вредности варијабле онда користите' цалл би референце 'приступ.

Top