2010-01-29 25 views
9

he leído de la Wikipedia que:¿Una referencia no puede ser NULL o puede ser NULL?

“References cannot be null, whereas pointers can; every reference refers to some object, although it may or may not be valid.”

Pero no creen porque de aspecto siguiente código al que el compilador da ningún error:

class person 
{ 
public: 
virtual void setage()=0; 
}; 
main() 
{ 
person *object=NULL; 
person &object1=*object; 
} 

Sírvanse explicar este punto.

+7

El artículo debe probablemente diría: "Toda referencia en un programa bien formada se refiere a un objeto" Desreferenciando un puntero nulo es, por supuesto, mal formado. – GManNickG

+0

Creo que lo que quería decir es 'person & object1 = object;', que de hecho le dará un error de compilación (tipos no coincidentes). –

+8

Y no nos olvidemos de todo nuestra historia favorita sobre referencias nulas: http://www.gotw.ca/conv/002.htm – GManNickG

Respuesta

9

Decir person &object1=*object no es el mismo que decir person &object1=NULL. Probablemente el compilador no sea lo suficientemente inteligente como para saber que está desreferenciando el puntero nulo, pero obtendrá un error de tiempo de ejecución de todos modos. Por lo que son una especie de verdad todavía;)

+0

ok ok Entiendo tu punto muy claramente gracias –

20

En su código:

person *object=NULL; 
person &object1=*object; 

que referencia a un puntero NULL, para que tenga un comportamiento indefinido. Y para responder a su pregunta, no existe una referencia NULL.

Y para hacer frente a la otra parte de su pregunta, sólo porque un programa compila, no hay ninguna garantía de que es correcto o que va a trabajar. Los compiladores de C++ no están obligados a siquiera intentar diagnosticar el tipo de error que contiene su código.

2

Bueno, usted puede hacer lo que desea en C++. Otro ejemplo:

person &object1 = *(reinterpret_cast<person*>(0)); 

Usted está invocando un comportamiento indefinido en el caso anterior, ¡además del caso que mencionó!

+0

Gracias Neil, lo corregí. – AraK

+0

¿Hay alguna razón por la que prefiera 'reinterpret_cast' a' static_cast'? (Se comportan igual en este caso, por supuesto.) – avakar

+0

@avakar Eso es lo que me vino a la mente cuando escribí la respuesta :) – AraK

3

que bloquearía su programa. ¿Intentó ejecutarlo? haciendo * objeto deferencia un puntero nulo, por lo que en realidad su referencia nunca se asigna.

+0

excelente respuesta lo entendí. –

+0

No creo que se bloquee. Se bloqueará solo si intenta acceder a miembros (o métodos) de object1. – Julio

+2

Podría colapsar, imprimir 42 o emitir humo azul; simplemente desenroscar un puntero nulo invoca un comportamiento indefinido, por lo que no puede saber de antemano. –

3

puede ordenar una referencia nula, no está seguro de por qué alguien podría decir lo contrario, es un efecto secundario desagradable de algunas operaciones. Simplemente no puedes crear uno directamente.

+0

No debería sorprenderme ver la votación negativa, siempre puedo decir qué hará estallar a las personas estúpidas del planeta que creen saber todo pero no saben nada. –

+2

Puede obtener referencias NULL * en la práctica *. Cada vez que uno dice "usted * no puede * tener referencias NULL", debe leer * en un programa bien formado *. Además de eliminar referencia de punteros NULL, también podría ser posible crear una referencia, de modo que '& ref == NULL' haciendo auto-inicialización:' int & ref = ref; '(el resultado podría ser cualquier cosa, incluido NULL, supongo). - No creo que haya nada malo que cubra el aspecto pragmático del problema, pero tu respuesta es vaga, desinformativa y argumentativa ("a pesar de lo que todos dicen, [algo de jerga aquí]"). – UncleBens

+0

@UncleBens, la referencia * Null * tiene connotaciones que no son compatibles con el idioma. Creo que la referencia * inválida * describe mejor la situación. Es una diferencia sutil, pero creo que es menos controvertido. –

0

sonido metálico 3,5 siquiera advierte sobre una posible comprobación posterior de una referencia NULL:

/tmp/person.C:11:6: warning: reference cannot be bound to dereferenced null pointer in well-defined C++ code; pointer may be assumed to 
     always convert to true [-Wundefined-bool-conversion] 
if (&object1) {} 
~~ ^~~~~~~ 
1 warning generated. 
Cuestiones relacionadas