2012-08-27 11 views
6

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

class c { 
    int i; 
    int j; 
    static int m; 
    static int n; 

    public: 
    void zap(); 
    static void clear(); 
}; 
+6

'static' सदस्यों * वर्ग के हैं *; चर के लिए, वे किसी ऑब्जेक्ट के बिना पहुंच योग्य हैं और उदाहरणों के बीच साझा किए गए हैं उदा। 'संरचना फू {स्थिर शून्य * बार; स्थैतिक शून्य * फू(); } ', इसलिए 'Foo :: bar' और' Foo :: fu 'कानूनी हैं। – oldrinb

+0

यह मानक द्वारा सख्ती से जरूरी नहीं है, लेकिन संकलित समय पर निर्धारित एक निश्चित पता सेट के अर्थ में स्थैतिक सदस्यों को स्थिर होने के बारे में सोचने में मदद कर सकता है (या नहीं!), जबकि गैर स्थैतिक सदस्य डेटा ढेर पर रखा जा सकता है या विभिन्न रनटाइम-निर्धारित पते पर ढेर। 'स्थैतिक' सदस्य मूल रूप से वैश्विक चर की तरह हैं, सिवाय इसके कि उनके पहचानकर्ता उन्हें घोषित कक्षा के दायरे में आते हैं। –

उत्तर

10

दाएं।

कीवर्ड static भारी भी कई अलग अलग अर्थ के साथ ओवरलोड हो गया है:

  • एक चर या समारोह नाम स्थान दायरे में पर यह नाम आंतरिक लिंकेज देता है।
  • कक्षा के सदस्य पर यह एक स्थिर सदस्य बनाता है, जो जुड़ाव को प्रभावित नहीं करता है।
  • फ़ंक्शन स्कोप पर एक चर पर यह "स्वचालित" या "गतिशील" भंडारण अवधि (यानी चर का जीवनकाल वैश्विक चर की तरह प्रोग्राम के अंत तक फैला हुआ है) के विपरीत चरम "स्थैतिक संग्रहण अवधि" देता है।
+1

गैर-वर्ग का अर्थ ज्यादातर सी में समान होता है: http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –

1

आप कह सकते हैं कि स्थिर सदस्य वर्ग के सदस्य हैं और कोई विशिष्ट वस्तु उदाहरण नहीं हैं। यही है, उनके पास सभी ऑब्जेक्ट उदाहरणों के लिए समान मूल्य है।

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

+1

सदस्य कार्यों को आम तौर पर * मान * नहीं माना जाता है। ;-) – oldrinb

2

जैसा कि मैंने my comment में कहा है, static सदस्य केवल व्यक्तिगत वस्तुओं की बजाय कक्षा से जुड़े हैं।

static सदस्यों वर्ग के हैं; चर के लिए, वे किसी ऑब्जेक्ट के बिना पहुंच योग्य हैं और उदाहरणों के बीच साझा किए गए हैं उदा।

struct Foo { 
    static void *bar; 
    static void *fu(); 
} 

तो Foo::bar और Foo::fu कानूनी हैं।

उन्हें सी ++ 03 मानक के § 9.4 में पेश किया गया है;

  1. एक वर्ग का एक डेटा या समारोह सदस्य एक वर्ग परिभाषा static, जिस स्थिति में यह एक स्थिर सदस्य वर्ग के है घोषित किया जा सकता है।

  2. एक static सदस्य वर्ग X की sयोग्य-आईडी अभिव्यक्ति X::s उपयोग करने के लिए भेजा जा सकता है; static सदस्य को संदर्भित करने के लिए कक्षा सदस्य पहुंच वाक्यविन्यास (5.2.5) का उपयोग करना आवश्यक नहीं है।एक static सदस्य वर्ग के सदस्य पहुँच वाक्य रचना, जिस स्थिति में वस्तु अभिव्यक्ति मूल्यांकन किया जाता है का उपयोग कर कहा जा सकता है

    class process { 
    public: 
        static void reschedule(); 
    }; 
    process& g(); 
    
    void f() 
    { 
        process::reschedule(); // OK: no object necessary 
        g().reschedule(); // g() is called 
    } 
    

    एक static सदस्य अपने वर्ग के दायरे में या दायरे में करने के लिए सीधे भेजा जा सकता है अपनी कक्षा से प्राप्त कक्षा (धारा 10) का; इस मामले में, static सदस्य नेस्टेड-नाम-विनिर्देशक योग्य-आईडी वर्ग गुंजाइश है जहाँ से static सदस्य संदर्भित है नामकरण की साथ, के रूप में अगर एक योग्य-आईडी अभिव्यक्ति इस्तेमाल किया गया था जाना जाता है।

    int g(); 
    struct X { 
        static int g(); 
    }; 
    struct Y : X { 
        static int i; 
    }; 
    int Y::i = g(); // equivalent to Y::g(); 
    

    ...

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

  • कोई संबंधित समस्या नहीं^_^