Gráfico de comparação:
Base para Comparação | Call_By_Value | Chamada por referência |
---|---|---|
Basic | Uma cópia da variável é passada. | Uma variável em si é passada. |
Efeito | A mudança em uma cópia da variável não modifica o valor original da variável para fora da função. | Mudança na variável afeta o valor da variável fora da função também. |
Parâmetros de Chamada | function_name (variable_name1, variable_name2, .....); | function_name (& variable_name1, & variable_name2, .....); // em caso de objeto object.func_name (object); |
Recebendo Parâmetros | tipo function_name (tipo variable_name1, tipo variable_name2, ....) {. . } | tipo function_name (tipo * variable_name1, tipo * variable_name2, .....). . } // em caso de objeto tipo function_name (class_type object_name) {. . } |
Chamadas Padrão | tipo primitivo são passados usando "call by value". | objetos são implicitamente passados usando "chamada por referência". |
Definição de chamada por valor
Se você passar um tipo de dado primitivo (inteiro, caractere e string) para uma função / método, apenas o "valor" é passado para o código da função. A função copia esse valor de um argumento para um 'parâmetro formal' do código de função. Se houver alguma modificação no parâmetro formal em um código de função, ele não modificará o valor original do argumento que é usado para chamar essa função.
Em palavras simples, se uma função / método é chamada pela abordagem 'chamada por valor'; então uma cópia da variável é passada para o código da função. Se um código de função fizer alguma alteração no valor da cópia da variável, isso não alterará o valor original da variável.
Vamos ver um exemplo para entender isso brevemente.
// exemplo na classe Java check {void change (int, int) {i = i * i; j = j / 2; system.out.println ("valor do parâmetro dentro da função"); system.out.println ("valor de 'i' que aceita o valor do argumento 'a'" + i); system.out.println ("valor de 'j' que aceita o valor do argumento 'b'" + j); }} classe call_by _value {public static void principal (string args []) {int a = 12, b = 20; verifique C = nova verificação (); system.out.println ("valor de 'a' e 'b' antes da chamada de função" + a + "" + b); C.change (a, b); // chama por valor. system.out.println ("valor de 'a' e 'b' depois da chamada de função" + a + "" + b); }} // valor de saída de 'a' e 'b' antes da chamada de função 12 20 valor do parâmetro dentro do valor da função 'i' que aceita o valor do argumento 'a' 144 valor de 'j' que aceita o valor de argumento 'b' 10 valor de 'a' e 'b' após a chamada de função 12 20
Definição de chamada por referência
Chamada por método de referência passa uma referência / endereço de um argumento para o código de função. Como o endereço de um argumento é passado para o código da função, o parâmetro formal que aceita esse endereço seria uma variável 'pointer'. Agora, como o código de função obteve o endereço de um argumento, a modificação no valor de um argumento também modificará o valor original de um argumento.
Em C ++ e Java, é muito comum passar o objeto para a função / método e o objeto é sempre passado por sua referência. As alterações feitas no objeto dentro da função / método afetam o objeto usado para invocar essa função / método.
O fragmento a seguir mostra a maneira correta de "chamar por referência".
// exemplo na classe C ++ swap {void troca (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = temp; }} int main {int a = 10, b = 20; cout << "valor de a, b antes da chamada de função" << a << "" <Agora vamos discutir 'chamada por referência' passando um 'objeto' como um argumento, que é implicitamente passado pela abordagem 'chamada por referência'.
verificação de classe {int a, b; check (int x, int b) {// objeto inicializado através deste construtor a = x; b = y; } troca nula (check ob) {ob.a = a * 2; ob.b = b / 2; }} classe main_class {public static void main (string args []) {verificar C = nova verificação (20, 40); // inicialização de objeto. system.out.println ("valor de 'ob.a' e 'ob.b' antes da chamada de função" + ob.a + "" + ob.b); Intercâmbio (C); // chama por referência. system.out.println ("valor de 'ob.a' e 'ob.b' antes da chamada de função" + ob.a + "" + ob.b); }} // valor de saída de 'ob.a' e 'ob.b' antes da chamada de função 20 40 value de 'ob.a' e 'ob.b' após a chamada de função 40 20Principais diferenças entre chamada por valor e chamada por referência
- Passar o argumento usando a abordagem 'chamada por valor' somente passa a cópia dessa variável, portanto, as alterações feitas no valor na cópia dessa variável não afetam o valor original dessa variável. Na abordagem 'chamada por referência', a própria variável é passada como um argumento, portanto, alterações nela modificam o valor da variável original.
- Se os argumentos passados forem tipos de dados primitivos, eles são simplesmente 'chamada por valor', mas se as referências / endereços dos argumentos ou objetos forem passados, então uma função é chamada pelo método 'chamada por referência'.
- Na abordagem de 'chamada por valor' os argumentos passados são apenas o nome das variáveis enquanto que, na abordagem 'chamada por referência' os argumentos passados são, nome da variável ao longo do sinal '&' ou um objeto que é passado apenas pelo seu nome.
- Os parâmetros de recebimento do argumento na abordagem 'call by value' são o nome da variável junto com seu tipo de dados. Em 'chamada por referência' abordagem o parâmetro de recebimento é sempre uma variável de ponteiro junto com o tipo de dados e no caso de objeto é um nome de objeto junto com seu tipo de classe.
Conclusão:
C ++ e Java usam ambas as abordagens, dependendo do que é passado. Se você quiser passar apenas o valor da variável use'call por valor 'abordagem e se você quiser ver a mudança no valor original da variável, então use a abordagem' chamada por referência '.