2009-09-08 21 views
97
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 ; 
} ; 
+115

~ es el operador de negación a nivel de bit. Cuando se aplica a una definición de función, significa que la función hará * lo opuesto * de lo que dice que hará, por ejemplo, '~ push()' realmente saltará la pila, y '~ writeSeriousComment()' en realidad producirá comentarios como este. –

+29

Para el beneficio del tipo de persona que parece publicar la mayoría de las preguntas de C++ en este sitio, no intente leer el comentario de j_random_hacker. – Alan

+34

en beneficio de las personas que tienen sentido del humor (y algunos conocimientos básicos de programación) INTENTE leer el comentario de j_random_hacker. –

Respuesta

104

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

He aquí una descripción de ibm.com:

Los destructores se utilizan generalmente para cancelar la asignación de memoria y hacer otra limpieza para un objeto de clase y sus miembros de clase cuando se destruye el objeto. Se solicita un destructor para un objeto de clase cuando ese objeto pasa fuera del alcance o se elimina explícitamente.

Ver https://www.ibm.com/support/knowledgecenter/SSB27U_5.4.0/com.ibm.zos.r9.cbclx01/cplr380.htm

3

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

Para ser claros, tiene que usar ~ NameOfTheClass como para el constructor, otros nombres no son válidos.

+2

"otros nombres son válidos"? –

+0

Respuesta anterior ... Creo que quise decir que después de ~ podría ser cualquier nombre siempre que sea igual que el nombre de clase y el nombre del constructor. – Klaim

5

Es un destructor. Se garantiza que se llamará a la función cuando el objeto sale del alcance.

+1

... si está asignado en la pila.Cuando se invoca 'eliminar' en el objeto si está asignado en el montón. – Jherico

+0

@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 sobre la dirección devuelta para que sea perfectamente posible la "nueva" memoria en la pila. :) La palabra clave "eliminar" llama al destructor y luego invoca "borrar operador". – Troubadour

+0

@Jherico o vive en el ámbito del espacio de nombres o es un miembro de la clase estática o una variable estática local de la función: la duración del almacenamiento estático. En otras palabras: todos los elementos con almacenamiento automático se destruirán automáticamente cuando corresponda. Tenga cuidado con [Static Initialization Order Fiasco] (http://stackoverflow.com/a/1005709/85371) – sehe

1

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

2

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

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

Falta un *. – Klaim

+0

saltos .. gracias :-) – Pierre

52

Como otros han señalado, en la instancia que está planteando es el destructor para class Stack.

Pero tomar su pregunta tal y como aparece en el título:

en C++ lo que hace un tilde “~” antes de un nombre de función significa?

hay otra situación. En cualquier contexto excepto inmediatamente antes del nombre de una clase (que es el contexto del destructor), ~ es el operador de complemento de uno (o bit a bit). Para estar seguro de que no viene muy a menudo, pero se puede imaginar un caso como

if (~getMask()) { ... 

que parece similar, pero tiene un significado muy diferente.

Cuestiones relacionadas