2009-09-08 18 views
97
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 ; 
} ; 
+115

~ थोड़ा सा नकारात्मक ऑपरेशन है। जब फ़ंक्शन परिभाषा पर लागू होता है, तो इसका अर्थ यह है कि यह फ़ंक्शन * विपरीत * करेगा जो यह कहता है कि यह करेगा - उदाहरण के लिए, '~ push() 'वास्तव में ढेर को पॉप करेगा, और' लिखना गंभीर सामग्री()' वास्तव में इस तरह की टिप्पणियां उत्पन्न करेंगे। –

+29

इस साइट पर अधिकांश सी ++ प्रश्न पोस्ट करने वाले व्यक्ति के लाभ के लिए, j_random_hacker की टिप्पणी पढ़ने का प्रयास न करें। – Alan

+34

उन लोगों के लाभ के लिए जो हास्य की भावना रखते हैं (और कुछ बुनियादी प्रोग्रामिंग ज्ञान) j_random_hacker की टिप्पणी पढ़ने का प्रयास करते हैं। –

उत्तर

104

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

यहाँ ibm.com से वर्णन दिया गया है है:

Destructors आमतौर पर स्मृति पुनःआवंटन के लिए इस्तेमाल किया और अन्य सफाई कर रहे हैं ऑब्जेक्ट नष्ट होने पर कक्षा वस्तु और उसके वर्ग के सदस्यों के लिए। एक वस्तु ऑब्जेक्ट के लिए एक विनाशक कहा जाता है जब वह वस्तु गुंजाइश से गुजरती है या स्पष्ट रूप से हटा दी जाती है।

देखें https://www.ibm.com/support/knowledgecenter/SSB27U_5.4.0/com.ibm.zos.r9.cbclx01/cplr380.htm

3

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

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

+2

"अन्य नाम वैध हैं"? –

+0

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

5

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

+1

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

+0

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

+0

@ जेरिको या नामस्थान क्षेत्र में रहता है या एक स्थैतिक वर्ग सदस्य या कार्य-स्थानीय स्थैतिक चर है: स्थिर भंडारण अवधि। दूसरे शब्दों में: स्वचालित भंडारण वाले सभी वैयरबेल उपयुक्त होने पर _automatically_ को नष्ट कर दिया जाएगा। [स्टेटिक प्रारंभिक आदेश Fiasco] से सावधान रहें (http://stackoverflow.com/a/1005709/85371) – sehe

2

(किसी भी गतिशील स्मृति को मुक्त) यह नाशक है। जब अपने वर्ग के उदाहरण नष्ट हो जाता है इस विधि कहा जाता है: दूसरों

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

एक * गायब है। – Klaim

+0

होप्स .. धन्यवाद :-) – Pierre

52

के रूप में उल्लेख किया है, उदाहरण में आप पूछ रहे हैं के बारे में यह class Stack के लिए नाशक है।

लेकिन आपके सवाल का वास्तव में लेने के रूप में यह शीर्षक में प्रकट होता है:

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

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

if (~getMask()) { ... 

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

संबंधित मुद्दे