Funções C ++ levando valores, onde eles deveriam receber referências
-
22-09-2019 - |
Pergunta
Estou apenas aprendendo C ++ e, vindo de C, algumas chamadas de função que estou vendo no livro me confundem:
char a;
cin.get(a);
Em C, isso não poderia funcionar, se você fez isso, não haveria maneira de obter a saída, porque você está passando por valor, e não por referência, por que isso funciona no C ++? A referência e o desreferimento estão implícitos (o compilador sabe que o Cin.get precisa de um ponteiro, por isso é referenciado)?
Solução
C ++
Isso funcionaria em C ++ porque a assinatura da função para get()
é provavelmente o seguinte:
void get(char& a); // pass-by-reference
o &
símbolo depois char
denota para o compilador do que quando você passa em um char
valor, deve passar em um referência para o char
em vez de fazer uma cópia dele.
O que isso significa essencialmente é que quaisquer alterações feitas dentro get()
será refletido no valor de a
fora do método.
Se a assinatura da função para get()
foi isto:
void get(char a); // pass-by-value
então a
seria passado por valor, o que significa uma cópia de a
é feito antes de ser passado para o método como um parâmetro. Qualquer alteração para a
Seria então o método local e perdido quando o método retornar.
C
A razão pela qual isso não funcionaria em C é porque C só tem Pass-por valor. A única maneira de imitar passada por referência O comportamento em C é passar seu ponteiro por valor e, em seguida, despertar o valor do ponteiro (acessando assim o mesmo local de memória) ao modificar o valor dentro do método:
void get(char* a)
{
*a = 'g';
}
int main(int argc, char* argv[])
{
char a = 'f';
get(&a);
printf("%c\n", a);
return 0;
}
A execução deste programa será lançada:
g
Outras dicas
Os tipos de referência funcionam como esse (passe por referência, em vez de passar por valor). É semelhante a passar um ponteiro (passe por ponteiro) em C, mas com uma sintaxe mais agradável e mais segurança (cheques de tempo de compilação). A implementação passa por ponteiro internamente.
C ++ permite passar por referência (observe o &
, que significa que uma referência é usada):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
É por isso que alguns programadores C ++ não gostam de usar referências como essa.
Parece um argumento de função - você não tem idéia da sintaxe se 'a' é modificada ou não.
Prefira referências constantes de passagem (quando você tem um objeto grande e uma cópia seria cara) e referências devolvendo ou o melhor de todos os ponteiros que passam.