Las ventajas de usar un puntero las describe 3DH: inicialización diferida, reducción en las dependencias del encabezado y control sobre la duración del objeto.
También son desventajas. Cuando tiene un miembro de datos de puntero, probablemente tenga que escribir su propio constructor de copia y operador de asignación, para asegurarse de que se crea una copia del objeto correctamente. Por supuesto, también debe recordar eliminar el objeto en el destructor. Además, si agrega un miembro de datos de puntero a una clase existente, debe recordar actualizar el constructor de copia y el operador =. En resumen, tener un miembro de datos de puntero es más trabajo para usted.
Otra desventaja es realmente la otra cara del control sobre la vida útil del objeto apuntado por el puntero. Los miembros de datos sin puntero se destruyen automágicamente cuando se destruye el objeto, lo que significa que siempre puede estar seguro de que existen mientras exista el objeto. Con el puntero, debe verificar que sea nullptr
, lo que significa que debe asegurarse de establecerlo en nullptr
siempre que no señale nada. Tener que lidiar con todo esto puede conducir fácilmente a errores.
Finalmente, es probable que el acceso a miembros que no sean punteros sea más rápido, ya que son contiguos en la memoria. Por otro lado, es probable que el acceso al miembro de datos del puntero que apunta a un objeto asignado en el montón haga que falte el caché, lo que lo hace más lento.
No hay una sola respuesta a su pregunta. Debe observar su diseño y decidir si las ventajas de los datos de los punteros superan el dolor de cabeza adicional. Si es importante reducir el tiempo de compilación y las dependencias del encabezado, use pimpl idiom. Si su miembro de datos puede no ser necesario para su objeto en ciertos casos, use un puntero y asigne cuando sea necesario. Si estos no suenan como razones convincentes, y no quiere hacer un trabajo extra, entonces no use un puntero.
Para la inicialización lenta, recomendaría usar 'boost :: optional' siempre que sea posible. Es más seguro que el puntero porque no puede hacer aritmética en él. –
Pero muchos (como yo) no usan Boost, así que esta es una plataforma y un marco de manera independiente ;-) ... Por ejemplo, solo uso Qt :-) – 3DH
Pero aquellos que no usan 'boost' deberían :) – GManNickG