2013-07-17 9 views
13

मेरे पास एक प्रश्न है कि एक स्थिर वर्ग सदस्य को शामिल करने के लिए कौन सा फ़ंक्शन चुना जाता है।स्थिर वर्ग सदस्य को आरंभ करने के लिए किस फ़ंक्शन का उपयोग किया जाता है?

//Base.h 

class Base 
{ 
private: 
    static int count; 
    static int countInit() 
    { 
     return 10; 
    } 
public: 
    Base() 
    { 
    } 
}; 

//and Base.cpp 
static int countInit() 
{ 
    return 0; 
} 
int Base::count=countInit();//member function is used. 
static int local_count=countInit();//the local one in Base.cpp 

चर Base::countBase::countInit() बजाय countInit() Base.cpp में परिभाषित के साथ आरंभ नहीं हो जाता। लेकिन local_count स्थानीय countInit द्वारा प्रारंभ किया गया है। तो, मुझे आश्चर्य है, क्या इस मामले में कोएनिग लुकअप जैसे नियम हैं?

+0

तो 'पूर्णांक बेस :: गिनती = countInit() ; सदस्य को बुलाता है? –

+1

@LuchianGrigore, हाँ, यह करता है। मुझे पता नहीं था कि हुआ। – chris

+0

"int बेस :: count = countInit();" आह्वान किया? स्थिर सदस्य फ़ंक्शन बेस :: countInit() गिनती केवल क्लास बेस के दायरे से countInit() द्वारा नहीं की जाती है। – lulyon

उत्तर

17

लिखने के बाद int Base::count आप कक्षा Base में हैं, इसलिए कक्षा के स्थिर कार्य को बुलाया जाएगा। अयोग्य देखने से 3.4.2/13

दसवीं कक्षा (9.4.2) के एक स्थिर डेटा सदस्य की परिभाषा में उपयोग किया जाने वाला नाम (यहाँ

उपयोग किया जाएगा स्थिर के योग्य-आईडी के बाद सदस्य) को देखा जाता है, मानो नाम एक्स के एक सदस्य समारोह में इस्तेमाल किया गया था

9.4.2

एक स्थिर डेटा सदस्य के लिए परिभाषा से संलग्न एक namespace दायरे में प्रदर्शित करेगा सदस्य कक्षा परिभाषा। नेमस्पेस स्कोप की परिभाषा में, स्थिर डेटा सदस्य का नाम :: ऑपरेटर का उपयोग करके अपने वर्ग के नाम से योग्य होगा। एक स्थिर डेटा सदस्य का परिभाषा प्रारंभकर्ता अभिव्यक्ति अपने वर्ग के दायरे में है

उदाहरण:

class process { 
static process* run_chain; 
static process* running; 
}; 
process* process::running = get_main(); 
process* process::run_chain = running; 

+0

धन्यवाद। बहुत साफ़। – Donglei

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