2011-08-31 12 views
9

इस कोड को संकलित करता है तथा त्रुटियों के बिना चलाता है:मैं निजी क्षेत्र से निजी कन्स्ट्रक्टर क्यों कॉल कर सकता हूं?

class foo{ 
    static foo *ref; 
    foo(){} 
    public: 
    static foo *getRef(){ 
     return ref; 
    } 
    void bar(){} 
}; 

foo* foo::ref = new foo; // the construcrtor is private! 

int main(int argc, const char *argv[]) 
{ 
    foo* f = foo::getRef(); 
    f->bar(); 
    return 0; 
} 

किसी समझा सकता है क्यों निर्माता कहा जा सकता है?

उत्तर

15

वह दायरा वैश्विक नहीं है - स्थैतिक सदस्य कक्षा के दायरे में हैं, और इसलिए उनकी प्रारंभिक अभिव्यक्ति कक्षा के दायरे में भी है।

+4

वास्तव में, एक compiler त्रुटि प्राप्त करने के लिए 'foo * ref = new foo;' ('foo ::' की अनुपस्थिति) के साथ अभिव्यक्ति को प्रतिस्थापित करें! –

10

उत्तर यह है कि यह वैश्विक दायरे में उपलब्ध नहीं है। एक स्थिर सदस्य का प्रारंभकर्ता कक्षा के दायरे के अंदर परिभाषित किया गया है, इसलिए इसका निजी सदस्यों तक पहुंच है।

§9.4.2/2 [...] एक स्थिर डेटा सदस्य की परिभाषा में प्रारंभकर्ता अभिव्यक्ति इसकी कक्षा (3.3.6) के दायरे में है।

-2

पुरानी सी ++ में स्थिर सदस्यों के प्रारंभिकरण के इस प्रकार की आवश्यकता नहीं है। बाद में सी ++ के रिलीज में उन्हें अनिवार्य बना दिया जाता है।

और, स्थिर सदस्य प्रारंभिकरण का यह रूप आमतौर पर किसी भी वर्ग वस्तुओं के निर्माण से पहले स्थिर सदस्यों को प्रारंभ करने के लिए उपयोग किया जाएगा।

(E.g) int MyClass::objectsCounter=0; 

लेकिन द्वारा,

foo* foo::ref = new foo; 

इस बयान तुम सिर्फ एक स्थिर सदस्य (सूचक प्रकार का है जो) एक नई वस्तु बनाने के द्वारा आरंभ कर रहे हैं।

और इस मामले में आप अपनी खुद की कक्षा की निजी विधि को कॉल करके एक निजी सदस्य को घुमा रहे हैं।

इसलिए यहां ग्लोब स्कोप की कोई भूमिका नहीं है।

+0

-1 आप "पुराने" और "बाद में" * सी ++ के रिलीज़ * के संदर्भ में क्या कह रहे हैं? AFAIK, यह 1 99 8 में पहले मानक के बाद से भाषा डिजाइन का हिस्सा रहा है। इसके अलावा, 'नया foo' का उपयोग करके हमेशा एक वस्तु उत्पन्न होती है। कथन 2 चीजें करता है: ए) प्रकार 'foo' का एक उदाहरण बनाया गया है; और बी) 'foo :: ref' को नए आवंटित ऑब्जेक्ट में पॉइंटर असाइन किया गया है। –

+0

@ एंड्रे कैरॉन आपकी टिप्पणियों के लिए धन्यवाद। मैंने अपनी पोस्ट संपादित की। मैं वास्तव में केवल यह जानकारी कहना चाहता था। लेकिन मैंने गलत तरीके से जानकारी दी। पुराने और बाद में सी ++ के बारे में: -, अब प्रदान की गई जानकारी पूरी संदर्भ-हरबर्ट के रूप में ली गई है। –

+0

यदि आप पेशेवर सी ++ प्रोग्रामिंग पर योजना बनाते हैं, तो आपको सी ++ समुदाय द्वारा अनुशंसित [सी ++ पुस्तकें] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) का उपयोग करने पर विचार करना चाहिए। –

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