Pergunta

Duplicate possíveis:
variável ponteiro e variável de referência em C ++

Quando devo declarar minhas variáveis ??como ponteiros vs objetos passaram por referência? Eles compilar a mesma coisa na montagem (pelo menos em tempo de execução asymptotically) então quando eu deveria usar o que?

void foo(obj* param)
void foo(obj& param)
Foi útil?

Solução

A minha regra é simples:. Uso * quando você quer mostrar que o valor é opcional e, portanto, pode ser 0

excluir da regra: todos os _obj_s redor são armazenadas em recipientes e você não quer fazer seu olhar código feio usando todos os lugares foo(*value); vez de foo(value); Então, em seguida, para mostrar que o valor não pode ser 0 put assert(value); na função começar.

Outras dicas

Eu sigo o guia de estilo Google padrão como faz mais sentido para mim. Ele afirma:

Dentro de listas de parâmetros de função todos referências devem ser const:

void Foo(const string &in, string *out);

Na verdade, é uma convenção muito forte no código do Google que os argumentos de entrada são valores ou referências const enquanto argumentos de saída são ponteiros. Entrada parâmetros podem ser ponteiros const, mas nunca permitir referência não-const parâmetros.

Um caso em que você pode querer uma entrada parâmetro para ser um ponteiro const é se você quer enfatizar que o argumento não é copiado, por isso deve existe para a vida útil do objecto; geralmente é melhor para documentar isso em comenta também. adaptadores STL tais como bind2nd e mem_fun não permitem parâmetros de referência, então você deve funções afirmar com ponteiro parâmetros nestes casos, também.

Uma das razões para ponteiros de uso é se faz sentido para passar um valor NULL para a função. Com um ponteiro, que espera que está a ser capaz de fazer isso. Com uma referência, não se espera que seja capaz de fazer isso.

(No entanto, fazendo coisas complicadas ainda é possível passar um NULL em um parâmetro de referência. Você pode esperar que a função chamada pode falhar neste caso.)

Outra convenção é que se você passar um ponteiro para uma função, a função pode usar o ponteiro para tomar posse do objeto (especialmente em um COM-like ambiente contados referência). Se você passar uma referência, então a função chamado pode esperar para usar o objeto para a duração da chamada de função, mas não para manter um ponteiro para o objeto para uso posterior.

A outra diferença entre ponteiros e referências é que está implícito que você não vai segurar uma referência, a menos que você passar um para um construtor. passagem ponteiros pode significar que um objeto pode agarrar-lo por um tempo, como um objeto padrão composto.

Uma boa razão para eu usar ponteiros e não referências nas minhas aplicações C ++, é a legibilidade. Ao usar um ponteiro que você ver o que está realmente acontecendo, e quando se utiliza ponteiros a sintaxe informa o que está realmente acontecendo.

O mesmo vale para "0" ou "NULL". Eu prefiro usar "NULL", desta forma 3 meses mais tarde, quando eu vejo um código que se parece com:

somevar_1 = 0;
somevar_2 = NULL;

Eu sei que somevar_1 é um int (ou float) e somevar_2 é algum tipo de ponteiro.

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