1: Passando Argumentos por Valor
Uma cópia da variável é feita e fornecida para a função quando argumentos são passados por valor . Todas as modificações feitas na variável dentro da função afetam apenas a cópia; nada é alterado para a variável original. Como resultado, passando por valor é um método seguro porque não há possibilidade de modificar involuntariamente o valor da variável original.
Passando por valor , no entanto, pode ser ineficaz, especialmente ao lidar com tipos de dados grandes ou complicados. Cada chamada de função que requer uma cópia dos dados pode esgotar rapidamente os recursos da CPU e da memória. Além disso, passando por valor não pode ser usado para funções que visam alterar o valor da variável original porque a cópia e a variável original não estão vinculadas.
2: Passando Argumentos por Referência
As variáveis podem ser passado por referência também em C++, o que ajuda a resolver esses problemas. A variável original é enviada para a função quando passando por referência , e qualquer modificação realizada na variável dentro da função também afetará a variável original. Devido a esta, passando por referência é substancialmente mais eficaz para tipos de dados grandes ou complicados e evita a necessidade de cópia.
Para evitar modificações indesejadas, uma função deve ser explicitamente designada como const. Adicionar a palavra-chave const à declaração da função, como em “int calculate(const int& a, const int& b),” fará isso.
No entanto, passando argumentos por referência requer atenção cuidadosa aos detalhes também. Programadores inexperientes podem cometer erros, como criar efeitos colaterais não intencionais, compartilhamento não intencional de dados e substituição de dados externos.
Considere o seguinte código que demonstra ambos métodos de passagem de argumento :
#includeusando namespace std ;
vazio PassByValue ( int x ) {
x = 5 ;
cout << 'Dentro de PassByValue: ' << x << fim ;
}
vazio PassByReference ( int & x ) {
x = 5 ;
cout << 'Dentro de PassByReference: ' << x << fim ;
}
int principal ( ) {
int num1 = 2 , num2 = 2 ;
cout << 'Antes das chamadas de função: num1= ' << num1 << ' num2 = ' << num2 << fim ;
PassByValue ( num1 ) ;
PassByReference ( num2 ) ;
cout << 'Após chamadas de função: num1=' << num1 << ' num2 = ' << num2 << fim ;
retornar 0 ;
}
No código acima, a primeira função, PassByValue , recebe um argumento inteiro por valor. Dentro da função, uma nova variável inteira é criada e recebe o valor 5. O inteiro original permanece inalterado. A segunda função, PassByReference , recebe um argumento inteiro por referência. Nesse caso, a função manipula diretamente a variável original.
Saída
Como esperado, a primeira chamada gera 5, mas não tem efeito na variável original. Por outro lado, a segunda chamada altera o valor de num2 para 5, o que afeta a saída da instrução final.
Passar por valor vs. Passar por referência
1: Maneira de chamar uma função
Uma diferença entre passando por valor e passando por referência é como a função é chamada. Quando passando por valor , a chamada da função deve incluir o valor da variável, como `calculate(a, b)`. Quando passando por referência , a chamada da função deve incluir o endereço de memória da variável, simbolizado por um caractere e comercial, como `calculate(&a, &b)`.
2: Tipos de dados
Em geral, passando por valor é mais apropriado ao trabalhar com tipos de dados pequenos ou simples, ou quando a função não pretende modificar a variável original. Passando por referência é mais apropriado para tipos de dados grandes ou complexos, ou quando a função pretende modificar o valor da variável original.
Conclusão
Quando os parâmetros são passado por valor para uma função, uma cópia da variável é criada e fornecida. Por passando por referência , a variável original é enviada para a função. Em C++, passando argumentos por valor ou por referência é um conceito fundamental. A escolha da abordagem correta depende das circunstâncias específicas e deve ser cuidadosamente avaliada. Os benefícios de usar o referência abordagem pode resultar em código mais eficaz, apesar da tentação de usar o mais fácil passando por valor método.