herencia - how to use a destructor c++
¿Es seguro terminar el destructor con una declaración de retorno? (4)
Mi pregunta es, ¿es seguro terminar un destructor con
return;
¿declaración? Sé que puedo usar para finalizar mis funciones devoid
conreturn;
Declaración pero esto es un destructor.
No hay mucha diferencia entre una función destructor y una función con tipo de retorno void
, además de que la función destructor se ejecuta automáticamente 1 cada vez que termina la vida útil de la clase.
Usas el return;
Si la ejecución de la función destructora debe detenerse, como lo hace con cualquier otra función.
1) Lo mismo se aplica a las funciones de constructor BTW.
En mi clase de lista Doble enlace, estoy codificando mi destructor y este es mi código:
DLinkedList::~DLinkedList() {
if(head==NULL){
return;
}
//other code
}
Mi pregunta es, ¿es seguro terminar un destructor con return;
¿declaración? Sé que puedo usar para finalizar mis funciones de void
con return;
Declaración, pero esto es un destructor.
Sí, está bien terminar la ejecución de un destructor con una return
.
Sí, no solo es seguro, el estándar establece explícitamente que es equivalente, y da explícitamente a los destructores como un caso de uso para declaraciones de devolución vacías.
6.6.3 La declaración de retorno [stmt.return]
1 Una función regresa a su interlocutor mediante la instrucción de retorno.
2 Una declaración de retorno sin una expresión ni una lista iniciada con braces solo se puede usar en funciones que no devuelven un valor, es decir, una función con el tipo de retorno cv void, un constructor (12.1) o un destructor ( 12.4).
[...]
Fluir fuera del final de una función es equivalente a una devolución sin valor
(énfasis agregado por mi)
Sí.
En este sentido, el cuerpo destructor actúa como una función que devuelve void
, excepto que las bases y los miembros aún serán destruidos incluso si return
antes (ya que esto nunca se basó en el contenido del cuerpo destructor).
Observe las siguientes reglas:
[special]/1
: el constructor predeterminado ([class.default.ctor]
), constructor de copia, constructor de movimiento ([class.copy.ctor]
), operador de asignación de copia, operador de asignación de movimiento ([class.copy.assign]
) , y destructor ([class.dtor]
) son funciones miembro especiales. [..]
[stmt.return]/1
: una función regresa a su interlocutor mediante la instrucción dereturn
.eel.is/c++draft/stmt.return#2 : la lista expr-or-braced-init de una declaración de
return
se denomina su operando. Una declaración dereturn
sin operando se usará solo en una función cuyo tipo de retorno sea cv void , un constructor o un destructor. [..]
[class.dtor]/9
: [..] Una declaración dereturn
([stmt.return]
) en un destructor podría no devolver directamente a la persona que llama; Antes de transferir el control a la persona que llama, se llaman los destructores para los miembros y las bases. [..]