Dalam c ++ apa yang ditandakan oleh tilde “~” sebelum nama fungsi?


142
 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 ;  
 } ;

Jawaban:


157

Itu destruktor, itu menghancurkan instance, membebaskan memori, dll. Dll.

Berikut deskripsi dari ibm.com:

Destruktor biasanya digunakan untuk membatalkan alokasi memori dan melakukan pembersihan lain untuk objek kelas dan anggota kelasnya saat objek dimusnahkan. Sebuah destruktor dipanggil untuk objek kelas ketika objek itu keluar dari ruang lingkup atau dihapus secara eksplisit.

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


1
Tautan ini sekarang rusak.
zenofpython

2
@zenpython Tetap!
inanutshellus

80

Seperti yang telah dicatat orang lain, dalam contoh yang Anda tanyakan tentang itu adalah destruktor untuk class Stack.

Tapi menjawab pertanyaan Anda persis seperti yang muncul di judul:

Dalam c ++ apa yang ditandakan oleh tilde “~” sebelum nama fungsi?

ada situasi lain. Dalam konteks apa pun kecuali segera sebelum nama kelas (yang merupakan konteks destruktor), ~adalah operator pelengkap (atau bukan bitwise). Yang pasti itu tidak terlalu sering muncul, tapi bisa dibayangkan kasus seperti itu

if (~getMask()) { ...

yang terlihat mirip, tetapi memiliki arti yang sangat berbeda.


8

Itu perusak. Fungsi tersebut dijamin akan dipanggil saat objek keluar dari ruang lingkup.


2
... jika dialokasikan di tumpukan. Saat 'delete' dipanggil pada objek jika dialokasikan di heap.
Jherico

@Jherico: Sebenarnya itu saat kata kunci "hapus" digunakan. Ingat bahwa kata kunci "baru" memanggil "operator baru" dan kemudian memanggil konstruktor pada alamat yang dikembalikan sehingga sangat mungkin untuk memori "baru" pada tumpukan. :) Kata kunci "delete" memanggil destruktor dan kemudian memanggil "operator delete".
Troubadour

@Jherico atau tinggal di ruang lingkup namespace atau merupakan anggota kelas statis atau variabel statis fungsi-lokal: durasi penyimpanan statis. Dengan kata lain: semua vairable dengan penyimpanan otomatis akan secara otomatis dihancurkan jika diperlukan. Waspadalah terhadap Perintah Inisialisasi Statis Fiasco
lihat

4

Ini adalah perusak. Ini dipanggil ketika objek dihancurkan (di luar ruang lingkup kehidupan atau dihapus).

Untuk memperjelas, Anda harus menggunakan ~ NameOfTheClass seperti untuk konstruktor, nama lain tidak valid.


2
"nama lain valid"?
Balapan Ringan di Orbit

Jawaban lama ... Saya rasa maksud saya setelah ~ itu bisa menjadi nama apapun asalkan sama dengan nama kelas dan nama konstruktor.
Klaim

2

Itu destruktornya. Metode ini dipanggil ketika instance kelas Anda dihancurkan:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.