C ++ ile bir tilde fonksiyon adından önce “~” ne anlama gelir?


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

Yanıtlar:


152

Yıkıcıdır, örneği yok eder, hafızayı boşaltır, vb.

İşte ibm.com'dan bir açıklama:

Yıkıcılar genellikle belleği ayırmak ve nesne yok edildiğinde bir sınıf nesnesi ve sınıf üyeleri için başka temizleme yapmak için kullanılır. Bu nesne kapsam dışına çıktığında veya açıkça silindiğinde, sınıf nesnesi için bir yıkıcı çağrılır.

Bkz. Https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm


1
Bu bağlantı şimdi kesildi.
zenofpython

2
@zenofpython Düzeltildi!
inanutshellus

76

Diğerlerinin de belirttiği gibi, bunun hakkında sorduğunuz durumda yıkıcıdır class Stack.

Ancak sorunuzu tam olarak başlıkta göründüğü gibi almak:

C ++ ile bir tilde fonksiyon adından önce “~” ne anlama gelir?

başka bir durum daha var. Sınıfın adından hemen önce (yıkıcı bağlamı olan) dışındaki herhangi bir bağlamda , ~kişinin tamamlayıcısı (veya bitsel olarak değil) operatörüdür. Çok sık gelmediğinden emin olmak için, ancak böyle bir vakayı hayal edebilirsiniz.

if (~getMask()) { ...

benzer görünüyor, ama çok farklı bir anlamı var.


8

Bu bir yıkıcı. Nesne kapsam dışına çıktığında işlevin çağrılması garanti edilir.


2
... yığına tahsis edilmişse. Öbek üzerinde tahsis edilmişse nesne üzerinde 'sil' çağrıldığında.
Jherico

@Jherico: Aslında "sil" anahtar kelimesinin kullanıldığı zamandır. "Yeni" anahtar kelimesinin "operatörü yeni" olarak çağırdığını ve daha sonra döndürülen adreste yapıcıyı çağırdığını ve böylece yığındaki "yeni" hafızanın mükemmel bir şekilde mümkün olduğunu unutmayın. :) "Delete" anahtar sözcüğü, yıkıcıyı çağırır ve "operatör silme" işlevini çağırır.
Troubadour

@Jherico veya ad alanı kapsamında yaşıyor veya statik sınıf üyesi veya işlev-yerel statik değişkendir: statik depolama süresi. Başka bir deyişle: otomatik depolamalı tüm değerler uygun olduğunda otomatik olarak imha edilir. Statik Başlatma Siparişine
sehe

4

Bu bir yıkıcı. Nesne yok edildiğinde (yaşam dışı kapsam veya silindiğinde) çağrılır.

Açık olmak gerekirse, yapıcı için ~ NameOfTheClass kullanmanız gerekir, diğer adlar geçersizdir.


2
"diğer isimler geçerlidir"?
Yörüngedeki Hafiflik Yarışları

Eski cevap ... Sanırım ben ~ sonra herhangi bir isim olabilir demek bir sınıf adı ve kurucu adı aynı.
Klaim

2

Bu yıkıcı. Sınıfınızın örneği yok edildiğinde bu yöntem çağrılır:

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

1

Bu yıkıcı olurdu (herhangi bir dinamik belleği serbest bırakır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.