2009-06-03 20 views
47

सी और सी ++ में स्थिर कीवर्ड के बीच क्या अंतर है?सी में स्थिर और सी ++ में स्थिर के बीच अंतर ??

+0

। क्या सी और सी ++ में फ़ाइल स्कोप में परिभाषित स्थैतिक चर में अर्थशास्त्र में कोई अंतर है ?? –

+0

फिर कोई फर्क नहीं पड़ता। –

+0

डुप: http://stackoverflow.com/questions/620024/static-in- अलग- भाषाएं – ephemient

उत्तर

8

यह दोनों भाषाओं में समान अर्थ है।

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

class Plop 
{ 
    static int x; // This is a member of the class not an instance. 

    public: 
    static int getX() // method is a member of the class. 
    { 
     return x; 
    } 
}; 

int Plop::x = 5; 
+0

लेकिन शीर्ष स्तर पर स्थैतिक का उपयोग सी ++ में बहिष्कृत किया गया है। सी – UncleO

+1

में यह ठीक है, यह निश्चित रूप से बहिष्कृत (अनुलग्नक डी 2) है, हालांकि, यह केवल नामस्थान क्षेत्र में वस्तुओं के लिए बहिष्कृत है। –

+0

पैक्स पोस्ट देखें। यह अतिरिक्त अर्थ स्थैतिक के सभी अर्थों के समान है। कीवर्ड सभी परिदृश्यों में एक चर के दृश्यता और अवधि को प्रभावित करता है, या तो फ़ाइल, फ़ंक्शन या कक्षा। इन सभी परिदृश्यों के पीछे एक ही नियम है। –

77

static कीवर्ड सी और सी ++ में समान उद्देश्यों को प्रदान करता है।

  1. जब फ़ाइल स्तर (फ़ंक्शन के बाहर) पर उपयोग किया जाता है, तो यह उस आइटम की दृश्यता सेट करता है जिस पर यह लागू होता है। स्टेटिक आइटम उनकी संकलन इकाई (उदा।, लिंकर को) के बाहर दिखाई नहीं दे रहे हैं। उनकी अवधि कार्यक्रम की अवधि के समान ही है।

    ये फ़ाइल-स्तरीय आइटम (फ़ंक्शंस और डेटा) स्थिर होना चाहिए जब तक कि उन्हें बाहर से एक्सेस करने की कोई विशिष्ट आवश्यकता न हो (और लगभग डेटा तक सीधे पहुंच देने की आवश्यकता नहीं होती है क्योंकि यह encapsulation के केंद्रीय सिद्धांत को तोड़ देता है)।

    यदि (जैसा कि प्रश्न पर आपकी टिप्पणी इंगित करती है) यह static का एकमात्र उपयोग है, तो आप तब से चिंतित हैं, नहीं, सी और सी ++ के बीच कोई अंतर नहीं है।

  2. जब किसी फ़ंक्शन के भीतर उपयोग किया जाता है, तो यह आइटम की अवधि निर्धारित करता है। फिर, अवधि कार्यक्रम के समान ही है और उस कार्य के आमंत्रण के बीच आइटम मौजूद है।

    यह उस आइटम की दृश्यता को प्रभावित नहीं करता है क्योंकि यह केवल फ़ंक्शन के भीतर दिखाई देता है। एक उदाहरण एक यादृच्छिक संख्या जनरेटर है जिसे अपने बीज मूल्य को इनोकेशन के बीच रखने की आवश्यकता है, लेकिन यह नहीं चाहता कि वह मान अन्य कार्यों के लिए दृश्यमान हो।

  3. सी ++ का एक और उपयोग है, static कक्षा के भीतर। जब वहां उपयोग किया जाता है, तो यह एक वर्ग वर्ग चर बन जाता है जो उस वर्ग की सभी वस्तुओं में आम है। एक क्लासिक उदाहरण उन वस्तुओं की संख्या को स्टोर करना है जिन्हें किसी दिए गए वर्ग के लिए तत्काल किया गया है।

जैसा कि अन्य ने बताया है, फ़ाइल-स्तरीय स्थैतिक का उपयोग अनामित नामस्थानों के पक्ष में बहिष्कृत कर दिया गया है। हालांकि, मेरा मानना ​​है कि यह वास्तव में भाषा से हटाए जाने से पहले एक निश्चित गर्म जगह में ठंडा दिन होगा - इस समय इसका उपयोग करके बहुत अधिक कोड है। और आईएसओ सी में केवल हैgets() को हटाने के लिए चारों ओर मिल गया है, हम सभी जानते हैं कि यह एक खतरनाक कार्य था।

और भले ही इसे बहिष्कृत किया गया हो, यह इसके अर्थशास्त्र अब को परिवर्तित नहीं करता है।

+2

जबकि फ़ाइल स्तर पर स्थैतिक एक फ़ाइल के दृश्यता को सीमित करने के संबंध में अनाम नामों के समान उद्देश्यों की सेवा करता है, वहां एक अंतर है। स्टेटिक के पास आंतरिक संबंध है, जबकि अज्ञात नामस्थान में बाहरी संबंध है (लेकिन नाम के कारण, अभी भी बाहरी रूप से सुलभ नहीं है) अज्ञात नेमस्पेस का बाहरी लिंक टेम्पलेट पैरामीटर के रूप में उपयोग किए जाने वाले नामों को घोषित करने की अनुमति देने के लिए आवश्यक है। – Pieter

+0

3/इस तरह लिखा जा सकता है: "स्टेटिक वर्ग वैरिएबल की अवधि को प्रोग्राम के समान ही सेट करता है। स्टेटिक चर के दृश्यता को प्रभावित नहीं करता है क्योंकि यह केवल कक्षा के भीतर ही दिखाई देता है।" मैंने आपकी पोस्ट के लिए सभी 3 गणनाओं में स्थिर की इस सामान्य विशेषताओं को समझ लिया। इससे पहले नहीं देखा था।+1 –

+1

एक बिंदु मुझे सी ++ फ़ंक्शन स्तर स्थिर चर में 2/- होना है जो पीओडी नहीं हैं या जो स्थिरांक के साथ प्रारंभ नहीं किए जाते हैं, तब तक नहीं रहते जब तक कि नियंत्रण उनकी घोषणा के माध्यम से गुजरता न हो। यह महत्वपूर्ण है, क्योंकि सी में विपरीत जहां केवल स्थिरांक को प्रारंभ करने की अनुमति है, सी ++ में यह मामला नहीं है, और यहां भी रचनाकार अन्य दुष्प्रभाव पैदा कर सकते हैं। –

12

फ़ाइल दायरे में स्थिर के उपयोग वर्तमान अनुवाद इकाई तक पहुंच को रोकना इसके बजाय सी

में सी ++ में हटा दिया गया है, लेकिन अभी भी स्वीकार्य, एक अनाम नाम स्थान

namespace 
{ 
    int file_scope_x; 
} 

चर घोषित उपयोग करें इस तरह से केवल फ़ाइल के भीतर उपलब्ध हैं, जैसे कि उन्हें स्थैतिक घोषित किया गया था।

अवमूल्यन का मुख्य कारण स्थिर कीवर्ड के कई अधिभारित अर्थों में से एक को हटाना है।

मूल रूप से, इसका मतलब यह था कि चर के रूप में चर, इस तरह के चर के लिए एक क्षेत्र में कार्यक्रम के जीवनकाल के लिए भंडारण दिया जाएगा, और स्टैक पर संग्रहीत नहीं किया जाएगा जैसा कि स्थानीय चर के लिए सामान्य है।

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

जब कक्षाएं सी ++ (और जावा और सी # में) के साथ आईं तो कीवर्ड का फिर से उपयोग किया गया था, लेकिन इसका मतलब कम से कम है मूल मंशा के करीब। इस प्रकार घोषित वैरिएबल को वैश्विक क्षेत्र में संग्रहीत किया जाता है, जैसा कि कार्य चर के रूप में ढेर पर या ऑब्जेक्ट सदस्यों के ढेर पर होता है। चूंकि चर शीर्ष स्तर पर और कक्षा परिभाषा के अंदर दोनों नहीं हो सकते हैं, इसलिए अतिरिक्त अर्थ वर्ग चर से जुड़ा हुआ हो सकता है। उन्हें केवल कक्षा के नाम से या उस वर्ग के किसी ऑब्जेक्ट के भीतर संदर्भित किया जा सकता है।

+2

"निर्यात" कीवर्ड पर पढ़ने लायक है। निर्यात का एक अप्रत्याशित दुष्प्रभाव यह है कि एक अनुवाद इकाई में एक निर्यातित टेम्पलेट अज्ञात नामस्थानों में वस्तुओं और कार्यों को संदर्भित कर सकता है! यह वास्तव में संभावना को बढ़ाता है कि सी ++ समिति को नामस्थान वस्तुओं पर स्थैतिक पुन: स्थापित करना होगा, क्योंकि यह सुनिश्चित करने का कोई तरीका नहीं है कि ये चर अन्य अनुवाद इकाइयों के लिए दृश्यमान नहीं हैं। –

+4

यह ध्यान दिया जाएगा कि फ़ाइल स्कोप स्थैतिक बहिष्करण सी ++ 11 के रूप में हटा दिया गया था, हालांकि यह अभी भी प्रकारों पर उपयोग नहीं किया जा सकता है। हालांकि, भविष्य में और भी बदलाव संभव हैं। – stan423321

6

ध्यान दें कि "फ़ाइल स्कोप" (उर्फ नेमस्पेस स्कोप) के लिए स्थिर का उपयोग केवल वस्तुओं के लिए सी ++ मानक द्वारा deoprecated है, कार्यों के लिए नहीं।

static मुख्य शब्द के उपयोग जब नाम स्थान दायरे में वस्तुओं की घोषणा पदावनत है: दूसरे शब्दों में ,:

// foo.cpp 
static int x = 0;    // deprecated 
static int f() { return 1; } // not deprecated 

स्टैंडर्ड के अनुलग्नक डी के शब्दों में।

0

आप सी में संरचना के अंदर स्थिर स्थिर घोषित नहीं कर सकते हैं ... लेकिन स्कोप रिज़ॉल्यूशन ऑपरेटर की सहायता से सीपीपी में अनुमति दी गई है।

जिसे CPP में स्थिर समारोह मैं वर्ग के सदस्य (डेटा या समारोह) स्थिर भाग के बारे में पूछ नहीं कर रहा हूँ केवल स्थैतिक चर का उपयोग कर सकते हैं, लेकिन सी में स्थिर समारोह स्थिर और गैर स्थैतिक चर हो सकता है ...

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