कंस्ट्रक्टर आरंभीकरण-सूची मूल्यांकन आदेश


252

मेरे पास एक कंस्ट्रक्टर है जो कुछ तर्क देता है। मैंने यह मान लिया था कि इनका निर्माण सूचीबद्ध क्रम में किया गया था, लेकिन एक मामले में ऐसा प्रतीत होता है कि इनका निर्माण उल्टा हो रहा था जिसके परिणामस्वरूप गर्भपात हो रहा था। जब मैंने तर्कों को उलट दिया तो कार्यक्रम निरस्त हो गया। यह मैं उपयोग कर रहे वाक्यविन्यास का एक उदाहरण है। बात यह है, इस मामले में a_ को b_ से पहले आरंभीकृत किया जाना चाहिए। क्या आप निर्माण के आदेश की गारंटी दे सकते हैं?

जैसे

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};

6
आप कहते हैं कि आप कंस्ट्रक्टर तर्कों के बारे में पूछ रहे हैं, लेकिन उनका मूल्यांकन करने से पहले आप कभी भी कंस्ट्रक्टर तक पहुँचते हैं, और उनका मूल्यांकन अनिर्दिष्ट, संकलक-निर्धारित क्रम में किया जाता है। लेकिन आप वास्तव में आरंभीकरण सूचियों के क्रम के बारे में पूछ रहे हैं, इसलिए मैंने आपके लिए प्रश्न शीर्षक बदल दिया है।
रॉब कैनेडी

जवाबों:


278

यह कक्षा में सदस्य चर घोषणा के आदेश पर निर्भर करता है। तो a_पहले वाला b_होगा , फिर आपके उदाहरण में दूसरा होगा।


22
वास्तव में, अच्छा संकलक चेतावनी देगा यदि आपके पास घोषणा में एक अलग क्रम है। उदाहरण के लिए, -Wreorderजीसीसी में देखें ।
ग्रेग हेवगिल

236
जिस कारण से वे सदस्य घोषणा क्रम में निर्मित किए जाते हैं और निर्माणकर्ता के आदेश में नहीं होते हैं वह यह है कि किसी के पास कई निर्माता हो सकते हैं, लेकिन केवल एक विध्वंसक है। और विध्वंसक निर्माण के पुनरुत्थान क्रम में सदस्यों को नष्ट कर देता है।
एपीग्रामग्राम

3
क्या हमारा मतलब था ... घोषणा का उल्टा क्रम। "निर्माण" का नहीं, विध्वंसक संभवतः इसे जानने के लिए निर्माणकर्ता में नहीं देख सकता है?
कॉनरैड बी

196

स्पष्टीकरण के लिए मानक उद्धृत करने के लिए:

12.6.2.5

प्रारंभिक क्रम निम्नलिखित क्रम में आगे बढ़ेगा:

...

  • फिर, नॉनस्टैटिक डेटा सदस्यों को उस क्रम में आरम्भ किया जाएगा, जो उन्हें कक्षा की परिभाषा में घोषित किया गया था (फिर से मेम-इनिशियलाइजर्स के आदेश की परवाह किए बिना)।

...


18

इसके लिए मानक संदर्भ अब 12.6.2 खंड 13.3 प्रतीत होता है:

(१३.३) - फिर, गैर-स्थैतिक डेटा सदस्यों को उस क्रम में आरम्भ किया जाता है, जो उन्हें कक्षा की परिभाषा में घोषित किया गया था (फिर भी मेमर्स-इनिशियलाइजर्स के आदेश की परवाह किए बिना)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.