हाल ही में, मैं अच्छी तरह से प्राप्त C++ FAQ से रचनाकारों के बारे में बहुत कुछ पढ़ रहा हूं। प्रविष्टियों में से एक का उल्लेख है कि रचनाकार के कोड-ब्लॉक के भीतर वर्ग सदस्यों को प्रारंभ करने के विरोध में प्रारंभिक सूचियों का उपयोग करना हमेशा सर्वोत्तम होता है।गैर-पॉइंटर क्लास सदस्यों को शुरू करना
ऐसा इसलिए है क्योंकि संकलक केवल एक प्रतिलिपि के बजाय कक्षा के सदस्यों की कई प्रतियां बनाना चाहता है।
उदाहरण
अच्छा
Foo::Foo(void)
: mBar(new Bar) //pointer to some memory address
{
}
बुरा
Foo::Foo(void)
{
mBar = new Bar;
}
एक बात यह भी कहा गया है (और, जबकि इस कंस्ट्रक्टर्स से संबंधित है, यह भी शुद्ध करने के लिए संबंधित जेनेरा में वस्तुओं का प्रारंभिकरण यहां तक कि गैर सदस्य कार्यों से एल) यह है कि जब जैसे कि निम्न तरीकों के माध्यम से एक वस्तु को प्रारंभ:
void f(void)
{
Foo foo(Bar()); //Bad.
foo.x(); //error
}
आप करेंगे, और मैं बोली: "[declare] a non-member function that returns a Foo object"
।
या यहां तक कि इस:
एक निम्न होना
प्रश्न
इस वजह से, यह बुद्धिमानी नहीं है (अधिक जानकारी के लिए, ऊपर के लिंक पर क्लिक करें)
Geometry::Geometry(void)
: mFaces(QVector<GLushort>),
mFinalized(false),
mNormals(QVector<QVector3D>),
mVerticies(QVector<QVector3D>)
जिस तरह से टी हेस आवंटित किए जाते हैं (यानी, तथ्य यह है कि ये गैर-पॉइंटर्स हैं), इससे मुझे आश्चर्य होता है कि इन वस्तुओं को शुरुआत में प्रारंभिकता की आवश्यकता है या नहीं। यदि वे करते हैं, तो क्या यह इसके बारे में जाने का सही तरीका है? या, प्रारंभिकरण की एक बेहतर विधि है?
कैसे इस वजह से रास्ता है कि सी ++ निर्माता आरंभीकरण के पीछे की कार्यप्रणाली तथ्य यह है कि मैं अज्ञानी हूं साथ निर्माता कार्यों का उपयोग कर, साथ दोनों आरंभ वस्तुओं से संबंधित प्रश्न
यह सामान्य प्रश्न से संबद्ध करने के लिए संबंधित स्टैक पर आवंटित वस्तुओं को चाहे या नहीं, या तो, मैं वैसे भी विश्वास करता हूं - (या तो, पॉइंटर आवंटन के बिना वस्तुएं) को पहले स्थान पर प्रारंभिक आवश्यकता है।
तो, क्या इसका मतलब यह है कि, ऊपर दिए गए कोड के अनुसार, मैं केवल उन ऑब्जेक्ट्स की कई प्रतियां बना रहा हूं जिन्हें मैं आवंटित कर रहा हूं? – zeboidlund
जब आप 'mFaces (QVector < GLushort >()) का उपयोग करते हैं, तो आप अस्थायी' QVector 'बनाते हैं, उस अस्थायी वस्तु से' mFaces' का निर्माण करें, फिर उस अस्थायी वस्तु को नष्ट करें। तो, हाँ, आप आवश्यक से अधिक वस्तुओं को बना रहे हैं। –