W języku C ++ co oznacza tylda „~” przed nazwą funkcji?

136
 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
źródło

Odpowiedzi:

150

Jest to destruktor, niszczy instancję, zwalnia pamięć itd.

Oto opis z ibm.com:

Destruktory są zwykle używane do zwalniania pamięci i wykonywania innych czynności porządkowych dla obiektu klasy i jego elementów członkowskich, gdy obiekt zostanie zniszczony. Destruktor jest wywoływany dla obiektu klasy, gdy ten obiekt wykracza poza zakres lub jest jawnie usuwany.

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

inanutshellus
źródło
1
Ten link jest teraz uszkodzony.
zenofpython
2
@zenofpython Fixed!
inanutshellus
75

Jak zauważyli inni, w instancji, o którą pytasz, jest to destruktor class Stack.

Ale biorąc pytanie dokładnie tak, jak pojawia się w tytule:

W języku C ++ co oznacza tylda „~” przed nazwą funkcji?

jest inna sytuacja. W każdym kontekście, z wyjątkiem bezpośrednio przed nazwą klasy (która jest kontekstem destruktora), ~jest operatorem dopełnienia (lub nie bitowym). Z pewnością nie zdarza się to zbyt często, ale możesz sobie wyobrazić taki przypadek

if (~getMask()) { ...

który wygląda podobnie, ale ma zupełnie inne znaczenie.

dmckee --- kociak ex-moderator
źródło
8

To niszczyciel. Funkcja zostanie wywołana, gdy obiekt znajdzie się poza zakresem.

Samuel Danielson
źródło
2
... jeśli jest przydzielony na stosie. Gdy na obiekcie jest wywoływana funkcja „delete”, jeśli jest ona przydzielona na stercie.
Jherico
@Jherico: Właściwie to jest to słowo kluczowe „usuń”. Pamiętaj, że słowo kluczowe „new” wywołuje „operator new”, a następnie wywołuje konstruktor na zwróconym adresie, dzięki czemu jest całkowicie możliwe utworzenie „nowej” pamięci na stosie. :) Słowo kluczowe „delete” wywołuje destruktor, a następnie wywołuje „operator delete”.
Troubadour,
@Jherico lub żyje w zakresie przestrzeni nazw lub jest statyczną składową klasy lub lokalną zmienną statyczną funkcji: statyczny czas trwania przechowywania. Innymi słowy: wszystkie przedmioty wartościowe z automatycznym przechowywaniem zostaną automatycznie zniszczone, gdy będzie to konieczne. Strzeż Static inicjalizacji zamówienia Fiasco
sehe
4

To jest destruktor. Jest wywoływana, gdy obiekt zostanie zniszczony (poza zakresem życia lub usunięty).

Żeby było jasne, musisz użyć ~ NameOfTheClass jak dla konstruktora, inne nazwy są nieprawidłowe.

Klaim
źródło
2
„inne imiona są prawidłowe”?
Wyścigi lekkości na orbicie
Stara odpowiedź ... Myślę, że chodziło mi o to, że po ~ może to być dowolna nazwa, o ile jest taka sama jak nazwa klasy i nazwa konstruktora.
Klaim
2

To jest niszczyciel. Ta metoda jest wywoływana, gdy instancja Twojej klasy zostanie zniszczona:

Stack<int> *stack= new Stack<int>;
//do something
delete stack; //<- destructor is called here;
Pierre
źródło
1

To byłby destruktor (zwalniający pamięć dynamiczną)

maxfridbe
źródło