2012-08-31 13 views
5

मैं यहां अन्य प्रश्नों के माध्यम से पढ़ रहा हूं और कुछ ऐसा है जो मुझे भ्रमित कर देता है और उम्मीद है कि इसे समझाया जा सकता है। मुझे यकीन है कि यह एक साधारण बात है लेकिन यह मुझे संकेत दे रही है।अनाम वैरिएबल बनाम निजी चर

तो C++ हम निजी चर कि वर्ग के भीतर ही देखा जा सकता है है:

class MyClass 
{ 
    private: 
     int i; 
}; 

लेकिन हम भी अनाम नामस्थान हो सकता है:

namespace 
{ 
    int i; 
} 

दोनों वर्ग के लिए निजी प्रतीत लेकिन दूसरे मामले में आप नहीं देख सकते कि वे हेडर फ़ाइल से मौजूद हैं। अन्य प्रश्नों को पढ़ने से ऐसा लगता है कि कार्य अलग-अलग हैं क्योंकि आप कक्षा वस्तुओं को पास नहीं कर सकते हैं? लेकिन मुझे यकीन नहीं है कि चर के लिए अंतर क्या है।

क्या दूसरे तरीके से कोई नुकसान है जिसका मतलब है कि आपको अभी भी निजी चर का उपयोग करना चाहिए?

उत्तर

13

वे समान नहीं हैं।

अज्ञात नामस्थान में पूर्ण iMyClass के सभी उदाहरणों द्वारा साझा किया जाएगा।

निजी पूर्णांक iMyClass में कक्षा के प्रत्येक तत्कालता के लिए अद्वितीय होगा।

private का उपयोग कर बराबर i स्थिर बनाने के लिए होगा:

//.h 
class MyClass 
{ 
    private: 
     static int i; 
}; 

और एक ही साझा i इस तरह का दृष्टांत:

//.cpp 
int MyClass::i = 0; 
+0

यह स्पष्ट है कि अब आप इसे समझाते हैं। मुझे पता था कि उन्हें कुछ मामलों में स्टेटिक्स पर पसंद किया गया था, लेकिन उन 2 कथनों ने किसी कारण से मेरे सिर में एक साथ बांध नहीं लिया :-) धन्यवाद – Firedragon

3

नामस्थान वस्तुओं/कक्षाओं से संबंधित नहीं हैं। विशेष रूप से, यदि आपके पास दो वस्तुएं हैं, तो प्रत्येक की एक निजी चर की अपनी प्रति है।

3

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

5

दोनों वर्ग के लिए निजी होने की ... दिखाई

नहीं, केवल प्रथम श्रेणी के लिए निजी है। यह एक गैर स्थैतिक सदस्य चर है; एक वर्ग प्रकार के हर वस्तु में तत्काल है।

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

क्या दूसरे तरीके से कोई नुकसान है जिसका मतलब है कि आपको अभी भी निजी चर का उपयोग करना चाहिए?

यदि आप प्रत्येक वर्ग ऑब्जेक्ट में चर की एक प्रति चाहते हैं, तो आपको इसे एक गैर स्थैतिक सदस्य होने की आवश्यकता है।

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

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