2014-09-04 5 views
0

Следующий код - пример вызова функции в обоих методах. Пожалуйста, расскажите мне о большой разнице или значении между вызовом по значению и вызовом по ссылке 1.Выберите значение. 2.Call по ссылке. Следующий код иллюстрирует метод вызова по значению.Функции в вызове C++ по значению и вызов по ссылке

я указал мои сомнения в комментариях

#include<iostream> 
int main(){ 
void change(int);//why function prototype is before function definition and what is 
int orig=10;//meaning of argument int, it did not defined any variable of type int 
cout<<"The original value is: "<<orig<<"\n"; 
change(orig);//what is the meaning of this piece of code 
cout<<"Value after change() is over:"<<orig<<"\n"; 
return 0; 
}; 
void change(int orig){ 
orig=20; 
cout<<"Value of orig in function change() is:"<<orig<<"\n"; 
return; 
} 

В книге я прочитал, что определение функции должна до прототипа функции.

+0

Я думаю, что [этот пост] (http://www.cplusplus.com/forum/lounge/62708/) в значительной степени объясняет основное различие между вызовом по значению и вызовом по ссылке. В двух словах, изменения параметра в вызываемой функции (1) * не изменят * действительную переменную, используемую в качестве аргумента функции, если * вызов по значению * и (2) * изменит * фактическую переменную, используемую как аргумент функции, если * вызов по ссылке *. – w00dbunny

ответ

0

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

Прототип функции void change(int); сообщает компилятор, что существует функция с именем изменение, которое принимает один аргумент типа int и возвращает void (то есть ничего). Это вызов по значению, так как нет аргумента &. Позже в вашем коде у вас есть строка change(orig);, которая фактически вызывает функцию с аргументом orig типа int. Поскольку прототип функции был объявлен до вызова этой функции, компилятор распознает ее как функцию.

Посмотрите на выходе этой программы:

#include<iostream> 

using namespace std; 

int main(){ 
    void change(int); 
    void change2(int&); 
    int x = 10; 
    cout<<"The original value of x is: "<< x <<"\n"; 
    change(x); // call change(), which uses call by value 
    cout<<"Value of x after change() is over: "<< x <<"\n"; 
    change2(x); // call change2(), which uses call by reference 
    cout<<"Value of x after change2() is over: "<< x <<"\n"; 
    return 0; 
}; 

void change(int orig){ 
    cout<<"Value of orig in function change() at beginning is: "<<orig<<"\n"; 
    orig=20; 
    cout<<"Value of orig in function change() at end is: "<<orig<<"\n"; 
    return; 
} 

void change2(int &orig){ 
    cout<<"Value of orig in function change2() at beginning is: "<<orig<<"\n"; 
    orig=20; 
    cout<<"Value of orig in function change2() at end is: "<<orig<<"\n"; 
    return; 
} 

Я изменил int orig в main() к int x многообещающе избежать путаницы имен, и я добавил change2() который использует вызов по ссылке.

0

Основное отличие - «передать по ссылке» передать ссылку объекта, а не копию объекта. Таким образом, вызываемая функция может обращаться к тому же месту памяти, где находится объект, и изменять его, если требуется. Напротив, когда копия объекта передается, модификация делается для скопированного объекта, а не оригинального.

Вы можете добавить следующее в ваш код и увидеть разницу:

#include<iostream> 
void change(int); 
void change_ref(int&); 

int main(){ 

    int orig=10;//meaning of argument int, it did not defined any variable of type int 
    cout<<"The original value is: "<<orig<<"\n"; 
    change_ref(orig);//what is the meaning of this piece of code 
    cout<<"Value after change() is over:"<<orig<<"\n"; 
    return 0; 
}; 

void change_ref(int& orig){ 
    orig=20; 
    cout<<"Value of orig in function change() is:"<<orig<<"\n"; 
    return; 
} 
+0

Не могли бы вы объяснить мне, почему вы указали тип данных int как argunent, у него нет переменных в строках 2 и 3 – 2014-09-04 03:50:46

+1

@aVIRA, эти строки являются декларациями функций.В объявлениях функций имена аргументов не требуются. Они могут быть там, но декларации полны без них. –

0

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

0

Хороший пример различия между передачей по ссылке или передачей по значению - это когда массив передается функции. Его можно передать указателем или ссылкой. Хороший пример находится по ссылке here.

Смежные вопросы