En los primeros días de C ++ cuando estaba atornillado encima de C, no podía usar NULL como se definió como (void*)0. No puede asignar NULL a ningún puntero que no sea void*, lo que lo hace un poco inútil. En aquellos días, se aceptaba que usabas 0(cero) para punteros nulos.
Hasta el día de hoy, he seguido usando cero como puntero nulo, pero los que me rodean insisten en usarlo NULL. Personalmente, no veo ningún beneficio en dar un nombre ( NULL) a un valor existente, y dado que también me gusta probar los punteros como valores de verdad:
if (p && !q)
do_something();
entonces usar cero tiene más sentido (como en el caso de que lo use NULL, no puede usarlo lógicamente p && !q; debe compararlo explícitamente NULL, a menos que suponga que NULLes cero, en cuyo caso por qué usarlo NULL).
¿Hay alguna razón objetiva para preferir cero sobre NULL (o viceversa), o todo es preferencia personal?
Editar: debería agregar (y tenía la intención de decir originalmente) que con RAII y excepciones, rara vez uso punteros cero / NULL, pero a veces todavía los necesita.