C ++ - स्टैटिक मेंबर फंक्शन 'कास्ट' क्वालीफायर के साथ क्यों नहीं बनाया जा सकता है


86

आज मुझे एक समस्या हुई। मैं एक staticसदस्य समारोह की जरूरत में हूं , constयह एक जरूरी नहीं बल्कि बेहतर है। लेकिन, मैं अपने प्रयासों में सफल नहीं हुआ। क्या कोई कह सकता है कि क्यों या कैसे?


1
एक constस्थिर सदस्य कार्य का क्या अर्थ होगा, आपके लिए?
GManNickG

2
@GMan मेरा मतलब है कि एक स्थिर सदस्य फ़ंक्शन जो इसके किसी भी इनपुट को कभी नहीं बदलता है।
प्रभाकरन

11
फिर आपके इनपुट्स (फंक्शन पैरामीटर) वैल्यू या कॉन्स्टेंट-रेफरेंस द्वारा होने चाहिए।
GManNickG

3
यह वैसे भी सदस्य कार्यों के तर्कों की स्थिरता को प्रभावित नहीं करता है। इसका मतलब यह नहीं है कि "सब कुछ बनाओ", इसका मतलब है " इस कास्ट को बनाओ "।
अंकलबेंस

@ मान आप यह कह रहे हैं कि तर्कों को जोड़ा जाना चाहिए
प्रभाकरण

जवाबों:


137

जब आप constक्वालीफायर को नॉनस्टैटिक सदस्य फ़ंक्शन पर लागू करते हैं , तो यह thisपॉइंटर को प्रभावित करता है । कक्षा के एक कास्ट-योग्य सदस्य फ़ंक्शन के लिए C, thisसूचक प्रकार का होता है C const*, जबकि सदस्य फ़ंक्शन के लिए जो कॉन्स्टेबल-योग्य नहीं होता है, thisसूचक प्रकार का होता है C*

एक स्थिर सदस्य फ़ंक्शन में एक thisसूचक नहीं होता है (इस तरह के फ़ंक्शन को किसी वर्ग के किसी विशेष उदाहरण पर नहीं बुलाया जाता है), इसलिए स्थिर सदस्य फ़ंक्शन का कॉन्स्टेबल योग्यता कोई मतलब नहीं रखता है।


क्या इसका मतलब है कि 'कॉन्स्ट' केवल चर जैसे इंट, पॉइंटर, आदि के लिए है? '
प्रभाकरन

@prabhakaran - सदस्य कार्यों जा सकती है स्थिरांक भी प्रवेश पा लिया। जेम्स ने स्पष्ट रूप से अपने उत्तर में इसका उल्लेख किया।
महेश

@ महेश मेम्बर फंक्शन के कास्ट क्वालिफायर भी, केवल 'इस पॉइंटर' को क्वालिफाई करते हैं, पूरे को नहीं। आप अभी भी कास्ट योग्य सदस्य फ़ंक्शन के भीतर वैश्विक चर को बदल सकते हैं। अब केवल मैंने इसकी जाँच की।
प्रभाकरण

5
-1 "एक स्थैतिक सदस्य फ़ंक्शन में यह पॉइंटर नहीं होता है ... इसलिए स्थैतिक सदस्य फ़ंक्शन की कॉन्स्टेबल योग्यता का कोई मतलब नहीं होता है [इस तरह]" अपने आप में सच है लेकिन प्रश्न के "एवर के रूप में गलत है" "। एक उत्तर के रूप में यह माना जाता है कि constएक स्थैतिक सदस्य के लिए एक गैर-स्थिर व्यक्ति के समान अर्थ होना चाहिए। एक उदाहरण के रूप में जो सोच नहीं रखता है, के अर्थ पर विचार करें static, जो संदर्भ पर निर्भर करता है।
चीयर्स एंड हीथ। - अल्फ

2
यह है C const*या const C*?
क्रॉच्रॉन

24

मैं आपके प्रश्न से सहमत हूं, लेकिन दुर्भाग्य से 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संशोधित नहीं किया जा सकता है। यदि इस नियम को मानक में जोड़ा जाए तो मुझे कोई भी भाषा दुष्प्रभाव दिखाई नहीं देता है। इसके विपरीत, यह मनोरंजक है कि ऐसा नियम क्यों नहीं है!


8
संभवतः यही कारण है कि आप "इस फ़ंक्शन को किसी भी वैश्विक चर को संशोधित नहीं करता है" का अर्थ करने के लिए एक नि: शुल्क फ़ंक्शन को संशोधित नहीं कर सकता है। constएक ऑब्जेक्ट पर लागू होता है (कास्ट मेंबर फ़ंक्शन के मामले में, जिस पर यह कहा जाता है)। आप इसे कक्षा के सभी स्थिर सदस्यों पर लागू करना चाहते हैं, मुझे लगता है कि यदि समिति द्वारा इस पर विचार किया गया था, तो यह समर्थन के लिए एक सामान्य पर्याप्त आवश्यकता नहीं थी।
स्टीव जेसप

1
constसंशोधक सदस्य तरीकों या सदस्य चर के लिए लागू नहीं है, लेकिन निहित करने के लिए this-pointer। चूंकि एक स्थिर सदस्य विधि किसी वस्तु के लिए बाध्य नहीं है, thisइसलिए बनाने के लिए कोई सूचक नहीं है const
रूड अल्थुइज़न

1

विवरण में आए बिना, यह इसलिए है क्योंकि फ़ंक्शन द्वारा संशोधित वस्तु हो सकती है या नहीं भी हो सकती है, इसलिए संकलक से अस्पष्ट है।

स्मरण करो जो constवस्तुओं को स्थिर रखता है, लेकिन निरंतर रखने के लिए यहां कोई वस्तु हो सकती है या नहीं भी हो सकती है।


2
"हो भी सकता है और नहीं भी"? एक स्थिर सदस्य फ़ंक्शन में कभीthis सूचक नहीं होता है । (इसके अलावा, constवस्तुओं को स्थिर नहीं रखता है। यह किसी विशेष सूचक या संदर्भ को ऑब्जेक्ट को संशोधित करने के लिए उपयोग करने से रोकता है, लेकिन संशोधन अभी भी किसी अन्य पथ के माध्यम से हो सकता है)
बेन Voigt

1

यह दुर्भाग्यपूर्ण है कि C ++ इसे डिज़ाइन के अनुसार स्वीकार नहीं करता है, लेकिन तार्किक रूप से ऐसे कुछ उपयोग मामले हैं जिनमें यह अच्छी तरह से मान्य है।

एक फ़ंक्शन जो वर्ग स्तर मान्य (स्थिर) है वह किसी भी स्थैतिक डेटा को नहीं बदल सकता है, हो सकता है कि यह सिर्फ क्वेरी डेटा कास्ट होना चाहिए। हो सकता है ऐसा ही हो

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios

1

एक 'कास्ट मेंबर फंक्शन' को उस ऑब्जेक्ट को संशोधित करने की अनुमति नहीं है, जिस पर उसे कॉल किया जाता है, लेकिन किसी भी ऑब्जेक्ट पर स्टैटिक मेंबर फ़ंक्शन को नहीं बुलाया जाता है। इसका उपयोग गुंजाइश रिज़ॉल्यूशन ऑपरेटर द्वारा सीधे किया जाता है। इस प्रकार एक स्थैतिक स्थिर सदस्य फ़ंक्शन का कोई मतलब नहीं है, इसलिए यह अवैध है।

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