2009-09-05 14 views
5

क्या बीच का अंतर:उद्देश्य c - स्थिर सदस्यों और स्थिरांक

@interface SomeClass : NSObject { 
    NSObject *something; 
} 

और

@interface SomeClass : NSObject { 

} 
NSObject *something; 

? इसके अलावा, जावा के अंतिम और उद्देश्य सी (सी) के कॉन्स के बीच क्या अंतर है? और मुझे निम्नलिखित स्थितियों के लिए स्थैतिक वर्ग के सदस्यों को कहां घोषित करना चाहिए: 1. जब केवल कक्षा को इसकी आवश्यकता होती है ** 2। ** जहां यह एक ऐसी संपत्ति होगी जहां अन्य वर्ग पढ़ सकें? मुझे पहले से ही #define के बारे में पता है, लेकिन यह वस्तुओं के लिए अच्छा नहीं है क्योंकि यह हर बार नए बनाता है। धन्यवाद!

उत्तर

7

पूर्व एक आवृत्ति चर है और कुछ क्लास के प्रत्येक उदाहरण के लिए something बनाता है। यह सी के

typedef struct { 
    NSObject *something; 
} SomeClass; 

उत्तरार्द्ध एक वैश्विक चर घोषित करता है जिसमें कुछ क्लास के साथ कोई वास्तविक संबंध नहीं है। सी में, यह

NSObject *something; 

वैश्विक दायरे में परिभाषित है। उद्देश्य-सी में वास्तव में वर्ग चर नहीं होते हैं, इसलिए वैश्विक चर का उपयोग किया जाता है (बल्कि, कभी-कभी उपयोग किया जाता है; compilation unit स्कोप और स्थिर storage class के साथ चर का उपयोग किया जाना चाहिए)।

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

कक्षा चर को नष्ट करना मुश्किल हो सकता है। मेमोरी पुनः प्राप्त की जाएगी और एप्लिकेशन बाहर निकलने पर खुले फाइलें स्वचालित रूप से बंद हो जाएंगी, लेकिन अन्य संसाधनों को बहुत अच्छी तरह से संभाला नहीं जा सकता है।

2

"अंतिम बनाम कॉन्स" प्रश्न के रूप में, दोनों समान हैं। वे बताते हैं कि मूल्य बदल नहीं सकता है। ध्यान दें कि जावा में, सभी मूल्यों (प्राइमेटिव को छोड़कर) पॉइंटर्स हैं, जिस ऑब्जेक्ट पर इशारा किया जा रहा है वह नीचे बदल सकता है, लेकिन मेमोरी लोकेशन (पॉइंटर) कभी नहीं बदलेगा। मेरा मानना ​​है कि आप उद्देश्य सी में समान व्यवहार की अपेक्षा करेंगे, और यह हमेशा अच्छा विचार है कि म्यूटेबल वाले तत्वों को "अंतिम" या "कॉन्स्ट" न होने दें, क्योंकि ऑब्जेक्ट के अंदर मान अभी भी संशोधित किए जा सकते हैं।

+0

ध्यान दें कि "अंतिम" एक कॉन्स पॉइंटर ("' * const' ") के समान है, न कि किसी कॉन्स (" const * '") के सूचक नहीं। यह सी ++ के संदर्भ प्रकारों ("' और '") के समान ही है। – outis

+0

स्पष्टीकरण के लिए धन्यवाद - मैं हमेशा विशेष मामलों को भ्रमित करता हूं :) – aperkins

+0

यदि आपको लगता है कि यह भ्रमित है, तो जांचें: http://www.strainu.ro/programming/c/a-little-fun-with-cdecl/ – outis

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