static
दुर्भाग्यवश, C ++ में कीवर्ड के कुछ अलग असंबंधित अर्थ हैं
जब डेटा सदस्यों के लिए उपयोग किया जाता है तो इसका मतलब है कि डेटा को कक्षा में आवंटित किया गया है न कि उदाहरणों में।
जब किसी फ़ंक्शन के अंदर डेटा के लिए उपयोग किया जाता है, तो इसका मतलब है कि डेटा को सांख्यिकीय रूप से आवंटित किया गया है, पहली बार ब्लॉक में प्रवेश किया जाता है और जब तक प्रोग्राम क्विट नहीं होता है तब तक रहता है। साथ ही वेरिएबल केवल फंक्शन के अंदर दिखाई देता है। स्थानीय स्टैटिक्स की यह विशेष विशेषता अक्सर सिंगलटन के आलसी निर्माण को लागू करने के लिए उपयोग की जाती है।
जब एक संकलन इकाई स्तर (मॉड्यूल) पर उपयोग किया जाता है, तो इसका मतलब है कि चर एक वैश्विक की तरह है (यानी आवंटित होने main
से पहले शुरू और नष्ट कर दिया गया है और main
बाहर निकलने के बाद नष्ट हो जाता है) लेकिन यह कि चर अन्य सुलभ इकाइयों में सुलभ या दृश्यमान नहीं होगा ।
मैंने उस हिस्से पर कुछ जोर दिया जो प्रत्येक उपयोग के लिए सबसे महत्वपूर्ण है। उपयोग (3) कुछ नामांकित नामस्थानों के पक्ष में हतोत्साहित किया जाता है जो गैर-निर्यात वर्ग घोषणाओं के लिए भी अनुमति देता है।
आपके कोड में static
कीवर्ड का उपयोग संख्या 2 के साथ किया जाता है और इसका कक्षाओं या उदाहरणों से कोई लेना-देना नहीं है ... यह फ़ंक्शन का एक चर है और इसकी केवल एक प्रति होगी।
जैसा कि सही रूप से iammilind ने कहा है कि यदि फ़ंक्शन एक टेम्प्लेट फ़ंक्शन था, तो उस वेरिएबल के कई उदाहरण हो सकते हैं (क्योंकि उस स्थिति में वास्तव में फ़ंक्शन प्रोग्राम में कई अलग-अलग प्रतियों में मौजूद हो सकता है)। यहां तक कि पाठ्यक्रम के वर्गों और उदाहरणों के मामले में अप्रासंगिक हैं ... निम्नलिखित उदाहरण देखें:
#include <stdio.h>
template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", num, baz++);
}
int main()
{
bar<1>(); // Output will be 0
bar<2>(); // Output will be 0
bar<3>(); // Output will be 0
bar<1>(); // Output will be 1
bar<2>(); // Output will be 1
bar<3>(); // Output will be 1
bar<1>(); // Output will be 2
bar<2>(); // Output will be 2
bar<3>(); // Output will be 2
return 0;
}
static int i
जो उदाहरण के लिए विशिष्ट का दायरा बनाता है , ताकि उदाo1.foo(); // i = 1
और$o2.foo(); // i = 1
...?