हां, प्रारंभिक सूची में सदस्य फ़ंक्शन का उपयोग मान्य है और मानक का अनुपालन करता है।
डेटा सदस्यों को उनकी घोषणा के क्रम में आरंभ किया गया है (और यही कारण है कि उन्हें अपनी घोषणा के क्रम में आरंभिक सूची में दिखना चाहिए - आपके द्वारा आपके द्वारा अनुसरण किए जाने वाले नियम)। N_
पहले आरंभ किया गया है और आप इस डेटा सदस्य को fill_arr
पर पारित कर सकते थे। fill_arr
को कन्स्ट्रक्टर से पहले बुलाया जाता है लेकिन चूंकि यह फ़ंक्शन अनियंत्रित डेटा सदस्यों तक नहीं पहुंचता है (यह डेटा सदस्यों तक नहीं पहुंचता है) इसकी कॉल सुरक्षित माना जाता है।
§ 12.6.2.13:: सदस्य कार्य (आभासी सदस्य कार्यों सहित 10.3) कहा जा सकता है
यहाँ सी ++ मानक के नवीनतम मसौदा (N3242 = 11-0012) से कुछ प्रासंगिक excepts हैं निर्माण के तहत एक वस्तु के लिए। (...) हालांकि, यदि इन परिचालनों को सीटीओआर-प्रारंभिक (या एक समारोह में सीटीओ-प्रारंभकर्ता से सीधे या परोक्ष रूप से कहा जाता है) में किया जाता है, तो सभी कक्षाओं के लिए मेम-प्रारंभकर्ताओं के पहले पूरा हो गया, ऑपरेशन का परिणाम अपरिभाषित है। उदाहरण:
class A { public: A(int); };
class B : public A {
int j;
public:
int f();
B() : A(f()), // undefined: calls member function
// but base A not yet initialized
j(f()) { } // well-defined: bases are all initialized
};
class C {
public:
C(int);
};
class D : public B, C {
int i;
public:
D() : C(f()), // undefined: calls member function
// but base C not yet initialized
i(f()) { } // well-defined: bases are all initialized
};
§12.7.1: एक गैर तुच्छ निर्माता के साथ एक वस्तु, निर्माता से पहले करने के लिए वस्तु के किसी भी गैर स्थिर सदस्य या आधार वर्ग चर्चा करते हुए के लिए में निष्पादन के परिणामों शुरू होता है अपरिभाषित व्यवहार। उदाहरण
struct W { int j; };
struct X : public virtual W { };
struct Y {
int *p;
X x;
Y() : p(&x.j) { // undefined, x is not yet constructed
}
};
स्रोत
2012-06-24 02:51:57
सवाल अच्छा है, लेकिन कोड नमूना कुछ हद तक कृत्रिम है। आपको 'fill_arr' को 'स्थिर' घोषित करने से क्या रोकता है और इसमें कोई संदेह नहीं है कि यह कानूनी है? –
क्या यह थ्रेड-सुरक्षित होगा? मेरा मतलब है, 'fill_arr' के लिए एक वेक्टर स्थानीय है, अगर यह 'स्थिर' है, तो क्या मैं इसे एक प्रकार के म्यूटेक्स से सुरक्षित रखूंगा? –
'std :: vector arr' में _automatic storage_ है, इसलिए फ़ंक्शन 'fill_arr' के प्रत्येक आमंत्रण के लिए इसका एक उदाहरण होगा। यह मूल है _C++ _... –