Recomendado, 2024

Escolha Do Editor

Diferença entre chamada por valor e chamada por referência

Em C ++ e Java, existem duas maneiras de chamar uma função ou um método. A primeira é “chamada por valor” e a segunda é “chamada por referência”. O método call by value passa apenas o valor de uma variável para o código da função e, se houver alguma alteração no valor de uma variável dentro dessa função, ela não afeta o valor original dessa variável. No método de chamada por referência, passamos a própria variável em um argumento e a mudança no valor de uma variável também afeta o valor original dessa variável. A principal diferença entre os dois métodos é que o método call by value passa o valor de uma variável e a call por referência passa o endereço dessa variável.

Gráfico de comparação:

Base para ComparaçãoCall_By_ValueChamada por referência
Basic
Uma cópia da variável é passada.Uma variável em si é passada.
EfeitoA 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 Chamadafunction_name (variable_name1, variable_name2, .....);function_name (& variable_name1, & variable_name2, .....);
// em caso de objeto
object.func_name (object);
Recebendo Parâmetrostipo 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ãotipo 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 20 

Principais diferenças entre chamada por valor e chamada por referência

  1. 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.
  2. 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'.
  3. 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.
  4. 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 '.

Top