Como passar argumentos para funções em C++: por valor versus por referência?

Como Passar Argumentos Para Funcoes Em C Por Valor Versus Por Referencia



Qualquer linguagem de programação, incluindo C++, deve ter a capacidade de fornecer parâmetros para funções. Por valor e por referência são os dois métodos principais que podem ser usados ​​para passar parâmetros. Ambas as abordagens têm vantagens e desvantagens, por isso é crucial que os programadores saibam quando utilizar cada uma delas.

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 :

#include

usando 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.