En c ++, ¿qué significa una tilde "~" antes del nombre de una función?

137
 template <class T>
 class Stack
 {
 public:
    Stack(int = 10) ; 
    ~Stack() { delete [] stackPtr ; }  //<--- What does the "~" signify?
    int push(const T&); 
    int pop(T&) ;  
    int isEmpty()const { return top == -1 ; } 
    int isFull() const { return top == size - 1 ; } 
 private:
    int size ;  
    int top ;  
    T* stackPtr ;  
 } ;
Monte Hurd
fuente

Respuestas:

152

Es el destructor, destruye la instancia, libera memoria, etc., etc.

Aquí hay una descripción de ibm.com:

Los destructores generalmente se usan para desasignar la memoria y hacer otra limpieza para un objeto de clase y sus miembros de clase cuando se destruye el objeto. Se llama a un destructor para un objeto de clase cuando ese objeto se sale del alcance o se elimina explícitamente.

Ver https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm

inanutshellus
fuente
1
Este enlace ahora está roto.
zenofpython
2
@zenofpython Fijo!
inanutshellus
75

Como otros han señalado, en el caso de que pregunte es el destructor class Stack.

Pero tomando su pregunta exactamente como aparece en el título:

En c ++, ¿qué significa una tilde "~" antes del nombre de una función?

Hay otra situación. En cualquier contexto, excepto inmediatamente antes del nombre de una clase (que es el contexto destructor), ~es el operador complementario (o no a nivel de bit). Para estar seguro de que no aparece con mucha frecuencia, pero puedes imaginar un caso como

if (~getMask()) { ...

que se ve similar, pero tiene un significado muy diferente.

dmckee --- gatito ex moderador
fuente
8

Es un destructor. Se garantiza que se llamará a la función cuando el objeto esté fuera de alcance.

Samuel Danielson
fuente
2
... si está asignado en la pila. Cuando se invoca "eliminar" en el objeto si está asignado en el montón.
Jherico
@Jherico: en realidad es cuando se usa la palabra clave "eliminar". Recuerde que la palabra clave "nuevo" invoca "operador nuevo" y luego llama al constructor en la dirección devuelta, por lo que es perfectamente posible "nueva" memoria en la pila. :) La palabra clave "eliminar" llama al destructor y luego invoca "operador eliminar".
Trovador
@Jherico o vive en el ámbito del espacio de nombres o es un miembro de clase estático o una variable estática local de función: la duración del almacenamiento estático. En otras palabras: todas las variables con almacenamiento automático se destruirán automáticamente cuando sea apropiado. Cuidado con el Fiasco de la orden de inicialización estática
sehe
4

Este es un destructor. Se llama cuando el objeto se destruye (fuera del alcance de la vida o se elimina).

Para que quede claro, debe usar ~ NameOfTheClass como para el constructor, otros nombres no son válidos.

Klaim
fuente
2
"otros nombres son válidos"?
Carreras de ligereza en órbita el
Respuesta anterior ... Creo que quise decir que después de ~ podría ser cualquier nombre siempre que sea el mismo que el nombre de la clase y el nombre del constructor.
Klaim
2

Es el destructor. Se llama a este método cuando se destruye la instancia de su clase:

Stack<int> *stack= new Stack<int>;
//do something
delete stack; //<- destructor is called here;
Pierre
fuente
1

Ese sería el destructor (liberando cualquier memoria dinámica)

maxfridbe
fuente