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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top