Tener dos objetos en la misma dirección significaría que no habría forma de distinguir entre estos dos objetos al hacer referencia a ellos con los punteros. Por ejemplo, en el siguiente código:
EmptyClass o1;
EmptyClass o2;
EmptyClass * po = &o;
po->foo();
se debe llamar al método foo en o1
o o2
?
Podría argumentarse que como estos objetos no tienen datos ni métodos virtuales (de lo contrario, tendrían un tamaño distinto de cero), no importa en qué instancia se invoca el método. Sin embargo, esto se hace más importante cuando queremos probar si dos objetos son iguales (es decir, si son lo mismo):
template < typename T >
bool isSame(T const & t1, T const & t2)
{
return &t1 == &t2;
}
EmptyClass o1; // one object and...
EmptyClass o2; // ...a distinct object...
assert(! isSame(o1, o2)); // ...should not be one and same object!
Para un ejemplo más concreto, vamos a suponer que yo quiero asociar algunos objetos (que se podía decir entidades) con algunos valores, digamos en un recipiente asociativa:
Person you;
Person me;
// You and I are two different persons
// (unless I have some dissociative identity disorder!)
// Person is a class with entity semantics (there is only one 'me', I can't make
// a copy of myself like I would do with integers or strings)
std::map< Person *, std::string > personToName;
personToName[&you] = "Andrew_Lvov";
personToName[&me] = "Luc Touraille";
// Oh, bother! The program confused us to be the same person, so now you and I
// have the same name!
Así que sí, todo se reduce a objeto de identidad: si los objetos se les permitió estar vacío, podrían ser privados de su identidad, que es simplemente no permitido por el idioma (afortunadamente).
Cada vez que veo preguntas como esta creo que el mundo se ha mejorado, se creó StackOverflow. – sharptooth