C ++ में फ़ंक्शन नाम के संकेत से पहले एक टिल्ड "~" क्या करता है?


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

जवाबों:


150

यह विनाशकारी है, यह उदाहरण को नष्ट कर देता है, स्मृति को मुक्त करता है, आदि।

यहाँ ibm.com से एक विवरण है:

विध्वंसक का उपयोग आमतौर पर मेमोरी को डील करने और क्लास ऑब्जेक्ट और उसके क्लास मेंबर्स के लिए अन्य क्लीनअप करने के लिए किया जाता है। एक विध्वंसक वर्ग वस्तु के लिए कहा जाता है जब वह वस्तु दायरे से बाहर हो जाती है या स्पष्ट रूप से नष्ट हो जाती है।

Https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm देखें


1
यह लिंक अब टूट गया है।
ज़ेनोफाइटन

2
@zenofpython फिक्स्ड!
inanutshellus

75

जैसा कि दूसरों ने उल्लेख किया है, उदाहरण में आप इसके बारे में पूछ रहे हैं कि यह किसके लिए विनाशकारी है class Stack

लेकिन अपना प्रश्न बिल्कुल वैसा ही लेना जैसा कि शीर्षक में दिखाई देता है:

C ++ में फ़ंक्शन नाम के संकेत से पहले एक टिल्ड "~" क्या करता है?

एक और स्थिति है। किसी भी संदर्भ में एक वर्ग के नाम से पहले (जो कि विनाशकारी संदर्भ है) को छोड़कर , ~किसी का पूरक (या बिटवाइज़ नहीं) ऑपरेटर है। यह सुनिश्चित करने के लिए कि यह बहुत बार नहीं आता है, लेकिन आप एक मामले की कल्पना कर सकते हैं

if (~getMask()) { ...

जो समान दिखता है, लेकिन बहुत अलग अर्थ है।


8

यह एक विध्वंसक है। फ़ंक्शन को ऑब्जेक्ट के दायरे से बाहर जाने पर कॉल करने की गारंटी दी जाती है।


2
... यदि इसका स्टैक पर आवंटित किया गया है। जब 'डिलीट' को ऑब्जेक्ट पर कॉल किया जाता है यदि उसका ढेर पर आवंटित किया जाता है।
झेरिको

@ जेरिको: वास्तव में यह तब है जब कीवर्ड "डिलीट" का उपयोग किया जाता है। याद रखें कि कीवर्ड "नया" "ऑपरेटर नया" को आमंत्रित करता है और फिर दिए गए पते पर निर्माता को कॉल करता है, इसलिए स्टैक पर "नई" मेमोरी के लिए यह पूरी तरह से संभव है। :) कीवर्ड "डिलीट" विध्वंसक को कॉल करता है और फिर "ऑपरेटर डिलीट" को आमंत्रित करता है।
Troubadour

@ जेरिको या नेमस्पेस दायरे में रहता है या एक स्थिर वर्ग सदस्य या फ़ंक्शन-स्थानीय स्थिर चर है: स्थिर भंडारण अवधि। दूसरे शब्दों में: स्वचालित भंडारण के साथ सभी vairables उचित होने पर स्वचालित रूप से नष्ट हो जाएंगे। स्टेटिक इनिशियलाइज़ेशन ऑर्डर
फ़ासको से

4

यह एक विध्वंसक है। यह तब कहा जाता है जब ऑब्जेक्ट नष्ट हो जाता है (जीवन क्षेत्र से बाहर या हटा दिया गया)।

स्पष्ट होने के लिए, आपको ~ NameOfTheClass का उपयोग करना होगा जैसे निर्माणकर्ता, अन्य नाम अमान्य हैं।


2
"अन्य नाम मान्य हैं"?
ऑर्बिट

पुराना उत्तर ... मुझे लगता है कि मेरा मतलब था कि ~ के बाद यह किसी भी नाम हो सकता है जब तक कि यह वर्ग के नाम और निर्माता के नाम के समान है।
10

2

यह विध्वंसक है। इस विधि को तब बुलाया जाता है जब आपकी कक्षा का उदाहरण नष्ट हो जाता है:

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

1

यह विनाशकारी होगा (किसी भी गतिशील स्मृति को मुक्त करना)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.