2009-04-16 16 views
72

पर पॉइंटर को हटाने से मेरे पास कॉन्स्ट पॉइंटर्स के बारे में एक बुनियादी सवाल है। मुझे किसी कॉन्स पॉइंटर का उपयोग करके किसी गैर-कॉन्स्ट सदस्य फ़ंक्शन को कॉल करने की अनुमति नहीं है। हालांकि, मैं एक स्थिरांक सूचक पर ऐसा करने की अनुमति हूँ:कॉन्स (टी कॉन्स *)

delete p; 

इस वर्ग के जो सार में एक गैर-स्थिरांक 'विधि' है की नाशक कॉल करेंगे। इसकी अनुमति क्यों है? क्या यह सिर्फ इसका समर्थन करने के लिए है:

delete this; 

या क्या कोई अन्य कारण है?

// dynamically create object that cannot be changed 
const Foo * f = new Foo; 

// use const member functions here 

// delete it 
delete f; 

लेकिन ध्यान दें कि समस्या ही सीमित नहीं है डायनामिक रूप से तैयार करने के लिए वस्तुओं:

{ 
const Foo f; 
// use it 
} // destructor called here 

स्थिरांक वस्तुओं विनाशकर्ता स्थिरांक वस्तुओं पर नहीं कहा जा सकता है, तो हम उपयोग नहीं कर सका

उत्तर

90

यह समर्थन करने के लिए है बिलकुल।

+17

+1। मुझे लगता है कि यह सच कारण है। कॉन्स ऑब्जेक्ट के लिए स्वचालित विनाशक कॉल - लगभग एफ को हटाने के समान; जहां कॉन्स पर एफ - सूचक। – bayda

37

इसे इस तरह से रखें - यदि यह नहीं था, तो const_cast का उपयोग किए बिना कॉन्स्ट ऑब्जेक्ट को हटाने का कोई तरीका नहीं होगा।

अर्थात्, कॉन्स्ट एक संकेत है कि एक वस्तु अपरिवर्तनीय होनी चाहिए। हालांकि, यह इंगित नहीं करता है कि वस्तु को हटाया नहीं जाना चाहिए।

+0

विनाशक वस्तुओं को हिंसक तरीकों से बदल सकते हैं, इसलिए यह 'अपरिवर्तनीय' शब्द का कुछ अजीब उपयोग होना चाहिए जिसे मैं पहले से अवगत नहीं था ... – DarthGizka

5

रचनाकारों और विनाशकों को 'विधियों' के रूप में नहीं देखा जाना चाहिए। वे कक्षा के किसी वस्तु को शुरू करने और फाड़ने के लिए विशेष संरचनाएं हैं।

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

4

इसे देखने का एक और तरीका: एक कॉन्स पॉइंटर का सटीक अर्थ यह है कि आप उस ऑब्जेक्ट में परिवर्तन करने में सक्षम नहीं होंगे जो उस या किसी अन्य पॉइंटर या उसी ऑब्जेक्ट के संदर्भ में दिखाई देगा । लेकिन जब कोई ऑब्जेक्ट नष्ट हो जाता है, तो अब हटाए गए ऑब्जेक्ट द्वारा पहले पते पर मौजूद सभी अन्य पॉइंटर्स उस ऑब्जेक्ट पर पॉइंटर्स नहीं हैं। वे एक ही पते को स्टोर करते हैं, लेकिन वह पता अब किसी ऑब्जेक्ट का पता नहीं है (वास्तव में इसे जल्द ही किसी भिन्न ऑब्जेक्ट के पते के रूप में पुन: उपयोग किया जा सकता है)।

यह भेद अधिक स्पष्ट होगा यदि सी ++ में पॉइंटर्स कमजोर संदर्भों की तरह व्यवहार करते हैं, यानी जैसे ही ऑब्जेक्ट नष्ट हो जाता है, इसके लिए सभी मौजूदा पॉइंटर्स तुरंत 0 पर सेट हो जाएंगे। (इस तरह की चीज को सभी सी ++ कार्यक्रमों पर लगाए जाने के लिए रनटाइम पर बहुत महंगा माना जाता है, और वास्तव में इसे पूरी तरह से विश्वसनीय बनाना असंभव है।)

6

मुझे किसी भी गैर-कॉन्स्ट सदस्य को कॉल करने की अनुमति नहीं है एक कॉन्स सूचक का उपयोग कर कार्य करता है।

हाँ आप हैं।

class Foo 
{ 
public: 
    void aNonConstMemberFunction(); 
}; 

Foo* const aConstPointer = new Foo; 
aConstPointer->aNonConstMemberFunction(); // legal 

const Foo* aPointerToConst = new Foo; 
aPointerToConst->aNonConstMemberFunction(); // illegal 

आप एक स्थिरांक वस्तु के लिए एक गैर स्थिरांक सूचक के साथ एक गैर स्थिरांक ऑब्जेक्ट में एक स्थिरांक सूचक भ्रमित किया है।

कहा करने के बाद कि,

delete aConstPointer; // legal 
delete aPointerToConst; // legal 

यह कारणों पहले से ही अन्य जवाब यहां द्वारा कहा गया के लिए, या तो नष्ट करने के लिए कानूनी है। आपके संपादन के लिए

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