În c++ ce înseamnă un tilde „~” înaintea unui nume de funcție? (Programare, C++)

Monte Hurd a intrebat.
 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 ;  
 } ;

6 răspunsuri
inanutshellus

Este destructorul, distruge instanța, eliberează memoria, etc. etc. etc.

Iată o descriere de pe ibm.com:

Distructorii sunt de obicei utilizați pentru a dezaloca memoria și pentru a face alte operațiuni de curățare pentru un obiect de clasă și membrii săi de clasă atunci când obiectul este distrus. Un destructor este apelat pentru un obiect de clasă atunci când obiectul respectiv iese din domeniul de aplicare sau este șters în mod explicit.

A se vedea https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm

dmckee — fostul moderator pisicuță

După cum au observat și alții, în cazul despre care întrebați este vorba despre destructorul pentru class Stack.

Dar luând întrebarea dvs. exact așa cum apare în titlu:

În c++ ce înseamnă o tilde „~” înaintea unui nume de funcție?

există o altă situație. În orice context cu excepția imediat înainte de numele unei clase (care este contextul destructorului), ~ este operatorul de complement la unu (sau de diferență în sens biunivoc). Cu siguranță, nu apare foarte des, dar vă puteți imagina un caz de genul

if (~getMask()) { ...

care arată asemănător, dar are o semnificație foarte diferită.

Samuel Danielson

Este un destructor. Funcția este garantată să fie apelată atunci când obiectul iese din domeniul de aplicare.

Comentarii

  • … dacă este alocat pe stivă. Când „delete” este apelat asupra obiectului, dacă acesta este alocat pe heap. –  > Por Jherico.
  • @Jherico: De fapt, este atunci când este folosit cuvântul cheie „delete”. Amintiți-vă că cuvântul cheie „new” invocă „operator new” și apoi apelează constructorul pe adresa returnată, deci este perfect posibil să „new” memoria pe stivă. 🙂 Cuvântul cheie „delete” apelează destructorul și apoi invocă „operator delete”. –  > Por Troubadour.
  • @Jherico sau trăiește la nivelul spațiului de nume sau este un membru static al clasei sau o variabilă statică locală a funcției: durata de stocare statică. Cu alte cuvinte: toate variabilele cu stocare automică vor fi automat fi distruse atunci când este cazul. Atenție la Fiasco-ul ordinii de inițializare statică –  > Por vezi.
Klaim

Acesta este un destructor. Este apelat atunci când obiectul este distrus (în afara domeniului de viață sau șters).

Pentru a fi clar, trebuie să folosiți ~NameOfTheClass ca pentru constructor, alte nume nu sunt valide.

Comentarii

  • Răspuns vechi… Cred că am vrut să spun că după ~ poate fi orice nume, atâta timp cât este același cu numele clasei și numele constructorului. –  > Por Klaim.
Pierre

Este vorba de destructor. Această metodă este apelată atunci când instanța clasei dvs. este distrusă:

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

maxfridbe

Acesta ar fi destructorul (eliberând orice memorie dinamică)

Tags: