आज मुझे एक समस्या हुई। मैं एक staticसदस्य समारोह की जरूरत में हूं , constयह एक जरूरी नहीं बल्कि बेहतर है। लेकिन, मैं अपने प्रयासों में सफल नहीं हुआ। क्या कोई कह सकता है कि क्यों या कैसे?
आज मुझे एक समस्या हुई। मैं एक staticसदस्य समारोह की जरूरत में हूं , constयह एक जरूरी नहीं बल्कि बेहतर है। लेकिन, मैं अपने प्रयासों में सफल नहीं हुआ। क्या कोई कह सकता है कि क्यों या कैसे?
जवाबों:
जब आप constक्वालीफायर को नॉनस्टैटिक सदस्य फ़ंक्शन पर लागू करते हैं , तो यह thisपॉइंटर को प्रभावित करता है । कक्षा के एक कास्ट-योग्य सदस्य फ़ंक्शन के लिए C, thisसूचक प्रकार का होता है C const*, जबकि सदस्य फ़ंक्शन के लिए जो कॉन्स्टेबल-योग्य नहीं होता है, thisसूचक प्रकार का होता है C*।
एक स्थिर सदस्य फ़ंक्शन में एक thisसूचक नहीं होता है (इस तरह के फ़ंक्शन को किसी वर्ग के किसी विशेष उदाहरण पर नहीं बुलाया जाता है), इसलिए स्थिर सदस्य फ़ंक्शन का कॉन्स्टेबल योग्यता कोई मतलब नहीं रखता है।
constएक स्थैतिक सदस्य के लिए एक गैर-स्थिर व्यक्ति के समान अर्थ होना चाहिए। एक उदाहरण के रूप में जो सोच नहीं रखता है, के अर्थ पर विचार करें static, जो संदर्भ पर निर्भर करता है।
C const*या const C*?
मैं आपके प्रश्न से सहमत हूं, लेकिन दुर्भाग्य से C ++ को इस तरह से डिज़ाइन किया गया है। उदाहरण के लिए:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
आज के रूप में, के constसंदर्भ में माना जाता है this। एक तरह से, यह संकीर्ण है। इसे पॉइंटर constसे परे लगाकर इसे व्यापक बनाया जा सकता है this।
यानी "प्रस्तावित" const, जो staticकार्यों पर भी लागू हो सकता है , staticसदस्यों को किसी भी संशोधन से प्रतिबंधित करेगा ।
उदाहरण कोड में, यदि foo()बनाया जा सकता है const, तो उस फ़ंक्शन में, A::sसंशोधित नहीं किया जा सकता है। यदि इस नियम को मानक में जोड़ा जाए तो मुझे कोई भी भाषा दुष्प्रभाव दिखाई नहीं देता है। इसके विपरीत, यह मनोरंजक है कि ऐसा नियम क्यों नहीं है!
constएक ऑब्जेक्ट पर लागू होता है (कास्ट मेंबर फ़ंक्शन के मामले में, जिस पर यह कहा जाता है)। आप इसे कक्षा के सभी स्थिर सदस्यों पर लागू करना चाहते हैं, मुझे लगता है कि यदि समिति द्वारा इस पर विचार किया गया था, तो यह समर्थन के लिए एक सामान्य पर्याप्त आवश्यकता नहीं थी।
constसंशोधक सदस्य तरीकों या सदस्य चर के लिए लागू नहीं है, लेकिन निहित करने के लिए this-pointer। चूंकि एक स्थिर सदस्य विधि किसी वस्तु के लिए बाध्य नहीं है, thisइसलिए बनाने के लिए कोई सूचक नहीं है const।
विवरण में आए बिना, यह इसलिए है क्योंकि फ़ंक्शन द्वारा संशोधित वस्तु हो सकती है या नहीं भी हो सकती है, इसलिए संकलक से अस्पष्ट है।
स्मरण करो जो constवस्तुओं को स्थिर रखता है, लेकिन निरंतर रखने के लिए यहां कोई वस्तु हो सकती है या नहीं भी हो सकती है।
this सूचक नहीं होता है । (इसके अलावा, constवस्तुओं को स्थिर नहीं रखता है। यह किसी विशेष सूचक या संदर्भ को ऑब्जेक्ट को संशोधित करने के लिए उपयोग करने से रोकता है, लेकिन संशोधन अभी भी किसी अन्य पथ के माध्यम से हो सकता है)
यह दुर्भाग्यपूर्ण है कि C ++ इसे डिज़ाइन के अनुसार स्वीकार नहीं करता है, लेकिन तार्किक रूप से ऐसे कुछ उपयोग मामले हैं जिनमें यह अच्छी तरह से मान्य है।
एक फ़ंक्शन जो वर्ग स्तर मान्य (स्थिर) है वह किसी भी स्थैतिक डेटा को नहीं बदल सकता है, हो सकता है कि यह सिर्फ क्वेरी डेटा कास्ट होना चाहिए। हो सकता है ऐसा ही हो
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
एक 'कास्ट मेंबर फंक्शन' को उस ऑब्जेक्ट को संशोधित करने की अनुमति नहीं है, जिस पर उसे कॉल किया जाता है, लेकिन किसी भी ऑब्जेक्ट पर स्टैटिक मेंबर फ़ंक्शन को नहीं बुलाया जाता है। इसका उपयोग गुंजाइश रिज़ॉल्यूशन ऑपरेटर द्वारा सीधे किया जाता है। इस प्रकार एक स्थैतिक स्थिर सदस्य फ़ंक्शन का कोई मतलब नहीं है, इसलिए यह अवैध है।
constस्थिर सदस्य कार्य का क्या अर्थ होगा, आपके लिए?