class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
क्या यह सही है?मैं सरणी को प्रारंभ करने के लिए सदस्य प्रारंभिक सूची का उपयोग कैसे कर सकता हूं?
class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
क्या यह सही है?मैं सरणी को प्रारंभ करने के लिए सदस्य प्रारंभिक सूची का उपयोग कैसे कर सकता हूं?
सी ++ 03 में सी-सरणी के साथ आप एकमात्र समझदार चीज कर सकते हैं यह मूल्य-प्रारंभिक है (सी ++ 11 में और इससे परे सूची-प्रारंभिक हो सकती है)।
सी ++ 03 मानक से, §8.5/7:
एक वस्तु जिसका प्रारंभकर्ता कोष्ठकों के एक खाली सेट है, जैसे कि,(), मूल्य प्रारंभ किया जाएगा।
और §8 से।5/5:
करने के लिए मूल्य-प्रारंभ प्रकार
T
की एक वस्तु का अर्थ है:
- अगर
T
एक उपयोगकर्ता के घोषित निर्माता के साथ एक कक्षा प्रकार है, तोT
के लिए डिफ़ॉल्ट निर्माता कहा जाता है (और अगरT
में कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है तो प्रारंभिकता खराब है);- यदि
T
उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर के बिना एक गैर-यूनियन क्लास प्रकार है, तो प्रत्येक गैर स्थैतिक डेटा सदस्य औरT
का बेस-क्लास घटक मूल्य-प्रारंभिक है;- यदि
T
एक सरणी प्रकार है, तो प्रत्येक तत्व मूल्य-प्रारंभिक है;- अन्यथा, वस्तु शून्य आरंभ नहीं हो जाता
करने के लिए शून्य से प्रारंभ प्रकार
T
की एक वस्तु का अर्थ है:
- अगर
T
एक अदिश प्रकार है, वस्तु है0
(शून्य) के मान पर सेटT
में परिवर्तित;- यदि
T
एक गैर-यूनियन वर्ग प्रकार है, प्रत्येक गैर-स्टेटिक डेटा सदस्य और प्रत्येक बेस-क्लास सबोबजेक्ट शून्य-प्रारंभिक है;- यदि
T
एक यूनियन प्रकार है, ऑब्जेक्ट का पहला नाम डेटा सदस्य) शून्य-प्रारंभिक है;- यदि
T
एक सरणी प्रकार है, तो प्रत्येक तत्व शून्य-प्रारंभ होता है;- यदि
T
एक संदर्भ प्रकार है, कोई प्रारंभिकता नहीं की जाती है।
इसलिए, यदि आपका निर्माता परिभाषा
A::A() : a(), ptr() { }
लिए बदल जाती है तो आप की गारंटी है कि बाद के निर्माण, A::a
के सभी 5 तत्वों मूल्य '\0'
होगा और A::ptr
अशक्त हो जाएगा।
डर नहीं; सी ++ इस तरह के प्रारंभिक सरणी का समर्थन नहीं करता है।
तुम बस A
के निर्माता शरीर में अपने सदस्यों के लिए आवंटित करने के लिए होगा, या आप उपयोग कर सकते हैं मूल्य initialisation यदि आप वास्तव में परवाह नहीं है क्या मान हैं:
struct A {
int x[5];
A() : x();
};
सी ,
struct A {
int x[5];
A() : x{1,2,3,4,5} {}
};
नोट हालांकि, कि क्योंकि सरणियों नहीं class-object
रों हैं, तो आप ऐसा करने के लिए सक्षम नहीं होगा:
struct A {
int x[5];
A(std::initializer_list<int[5]>& i) // or whatever the T should be
: x{i} // or x(i)
{}
}
A a({1,2,3,4,5)};
प्रतीक्षा करें, सी ++ 0x में नहीं? डी: – GManNickG
ठीक है, सी ++ 0x में यह समझा जाता है (मुझे उम्मीद है!) कि आपको हमेशा सी-एरेज़ पर 'std :: array <>' का उपयोग करना चाहिए, जिसे समझदारी से और सस्ते रूप से शुरू किया जा सकता है और स्थिर सदस्य फ़ंक्शन से वापस किया जा सकता है c'tor प्रारंभिक सूचियों में उपयोग के लिए। – ildjarn
@GMan: वास्तव में। आप किसी सरणी को 'std :: startizer_list <>' के साथ प्रारंभ नहीं कर सकते हैं, क्योंकि सरणी में कोई कन्स्ट्रक्टर नहीं है। आप अभी भी संलग्न प्रकार के कन्स्ट्रक्टर बॉडी में _something_ के माध्यम से पुनरावृत्ति समाप्त कर देते हैं। Ildjarn ने कहा कि यह वास्तव में एक समस्या नहीं है कि कारण है। –