2012-01-18 24 views
8

हाल ही में, मैं अच्छी तरह से प्राप्त 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>) 

जिस तरह से टी हेस आवंटित किए जाते हैं (यानी, तथ्य यह है कि ये गैर-पॉइंटर्स हैं), इससे मुझे आश्चर्य होता है कि इन वस्तुओं को शुरुआत में प्रारंभिकता की आवश्यकता है या नहीं। यदि वे करते हैं, तो क्या यह इसके बारे में जाने का सही तरीका है? या, प्रारंभिकरण की एक बेहतर विधि है?

कैसे इस वजह से रास्ता है कि सी ++ निर्माता आरंभीकरण के पीछे की कार्यप्रणाली तथ्य यह है कि मैं अज्ञानी हूं साथ निर्माता कार्यों का उपयोग कर, साथ दोनों आरंभ वस्तुओं से संबंधित प्रश्न

यह सामान्य प्रश्न से संबद्ध करने के लिए संबंधित स्टैक पर आवंटित वस्तुओं को चाहे या नहीं, या तो, मैं वैसे भी विश्वास करता हूं - (या तो, पॉइंटर आवंटन के बिना वस्तुएं) को पहले स्थान पर प्रारंभिक आवश्यकता है।

उत्तर

12

यदि कोई सदस्य चर एक क्लास प्रकार का है जो उपयोगकर्ता द्वारा घोषित डिफ़ॉल्ट कन्स्ट्रक्टर के साथ है, तो आपको इसे प्रारंभिक सूची में स्पष्ट रूप से उल्लेख करने की आवश्यकता नहीं है: इसके डिफ़ॉल्ट कन्स्ट्रक्टर को किसी भी समय, निर्माण के दौरान, शरीर के पहले निर्माता प्रवेश किया गया है।

एक सदस्य चर एक आदिम प्रकार (int या bool) की तरह है या एक वर्ग प्रकार किसी भी उपयोगकर्ता के घोषित कंस्ट्रक्टर्स नहीं है कि की है, तो आप अन्यथा यह आरंभ नहीं किया जा जाएगा यह स्पष्ट रूप से प्रारंभ करने की आवश्यकता, (और इसका एक अज्ञात मूल्य होगा; आप एक अनियमित वस्तु नहीं पढ़ सकते हैं)।

+0

तो, क्या इसका मतलब यह है कि, ऊपर दिए गए कोड के अनुसार, मैं केवल उन ऑब्जेक्ट्स की कई प्रतियां बना रहा हूं जिन्हें मैं आवंटित कर रहा हूं? – zeboidlund

+3

जब आप 'mFaces (QVector < GLushort >()) का उपयोग करते हैं, तो आप अस्थायी' QVector 'बनाते हैं, उस अस्थायी वस्तु से' mFaces' का निर्माण करें, फिर उस अस्थायी वस्तु को नष्ट करें। तो, हाँ, आप आवश्यक से अधिक वस्तुओं को बना रहे हैं। –

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

  • कोई संबंधित समस्या नहीं^_^