2010-03-19 13 views
11

जब मेरे वर्गों लेखन, M_ के साथ सभी सदस्य चर लगाकर मैं हमेशा एक अच्छा लड़का किया गया है:सी ++ निर्माता प्रारंभ सूची विचित्रता

class Test { 
    int m_int1; 
    int m_int2; 
public: 
    Test(int int1, int int2) : m_int1(int1), m_int2(int2) {} 
}; 

int main() { 
    Test t(10, 20); // Just an example 
} 

हालांकि, हाल ही मैं ऐसा करना भूल गया और लेखन समाप्त हो गया:

class Test { 
    int int1; 
    int int2; 
public: 
    // Very questionable, but of course I meant to assign ::int1 to this->int1! 
    Test(int int1, int int2) : int1(int1), int2(int2) {} 
}; 

मानो या नहीं, कोई त्रुटि/चेतावनियों के साथ संकलित कोड और असाइनमेंट सही तरीके से हुआ! यह केवल तब हुआ जब मेरे कोड में जांच करने से पहले अंतिम जांच कर रही थी जब मुझे एहसास हुआ कि मैंने क्या किया है।

मेरा प्रश्न है: मेरा कोड संकलित क्यों हुआ? क्या ऐसा कुछ ऐसा है जो सी ++ मानक में अनुमत है, या यह केवल संकलक होने का मामला है? यदि आप सोच रहे थे, तो मैं विजुअल स्टूडियो 2008

+4

आपके नामों को मंगल करना मुश्किल है जो मैं "अच्छा लड़का" होने पर विचार करता हूं। जैसा कि आपने पाया है, आमतौर पर यह जरूरी नहीं है, और दुर्लभ अवसरों पर जहां, यह है 'हमें->' उपसर्ग मिला है। – jalf

+0

शायद एक डुप्ली, http://stackoverflow.com/questions/2227244/what-if-a-constructor-parameter-has-the-same-name-as-a-member-variable-in-c – Abhay

+2

@jalf देखें : दूसरी ओर कुछ प्रकार के सदस्य-var संकेतक कभी-कभी पढ़ने के कोड को आसान बना सकते हैं (जब मैं मौजूदा सम्मेलन को तोड़ता नहीं हूं तो मैं पिछला _ का उपयोग करता हूं)। –

उत्तर

26

हां, यह मान्य है। सदस्य प्रारंभकर्ता सूची में नाम कन्स्ट्रक्टर की कक्षा के संदर्भ में देखे जाते हैं, इसलिए int1 सदस्य चर का नाम पाता है।

प्रारंभकर्ता अभिव्यक्ति को निर्माता के संदर्भ में देखा जाता है ताकि int1 सदस्य चर को मास्क करने वाले पैरामीटर को पाता है।

+2

बिल्कुल सही, और संक्षेप में डाल दिया। वाहवाही! +1 –

+0

+1, अच्छा ब्रावो लड़का! xD –

0

पर विचार करता हूं, मुझे लगता है कि यह काम करता है क्योंकि आप प्रारंभिक सूची में int1 का उपयोग कर रहे थे, और केवल उन्हीं चीजों को आप प्रारंभ कर सकते हैं सदस्य चर => यह वास्तव में स्पष्ट था कि चर शुरू किया जा रहा है।

चाहे सभी सी ++ कंपाइलर्स यह क्षमा कर रहे हों, एक और मामला है!

+0

आईआईआरसी जी ++ यह भी अधिकृत करता है कि :-)। – p4bl0

+11

यह मानक सी ++ है। –

+1

स्पष्टीकरण के लिए धन्यवाद। बेशक केवल सदस्य चर प्रारंभिक सूची में कोष्ठक के बाहर दिखाई दे सकते हैं। लेकिन कोष्ठक के अंदर क्या है पूरी तरह स्पष्ट नहीं है। उदाहरण के लिए, यदि हमारे पास है: टेस्ट (int int1): int1 (int1 + 1), int2 (int1) {} अब दूसरे कोष्ठक पर int1 क्या है?क्या इसका मतलब है :: int1 या इसका मतलब यह है-> int1? – Andy

15

आपने जो किया है वह मानक सी ++ है। प्रारंभिक सूची में केवल सदस्य चर या बेस क्लास को initliazed किया जा सकता है, इसलिए paranthesis के बाहर चर संगत है। कोष्ठक के भीतर, विशिष्ट स्कोपिंग नियम लागू होते हैं, और सदस्यों को पैरामीटर नामों से ढका दिया जाता है।

+1

+1 यह एकमात्र उत्तर है जो catagorically कहता है कि यह मानक सी ++ के साथ ही एक स्पष्टीकरण दे रहा है। –

2

यह बिल्कुल सामान्य व्यवहार है। जैसा कि एएटी ने सही तरीके से बताया, कोई अस्पष्टता नहीं है। सूची द्वारा शुरू किए गए चर वर्ग के सदस्य होना चाहिए। यह मानक है और सभी अनुपालन कंपाइलरों में काम करता है।

इस तरह की सूची का उपयोग करते समय याद रखने की एकमात्र चीज यह है कि एक व्यक्ति जो इस तरह के कोड को समझ नहीं पाता है उसे इसे बनाए रखना पड़ सकता है। जब तक आप जानते हैं कि आप क्या कर रहे हैं, तब तक प्रारंभिकरण कोड लिखने में कुछ भी गलत नहीं है।

0

आपने जो किया है वह सामान्य है। इस प्रकार के कार्यान्वयन से आपको 'इस' सूचक (इस मामले में) का उपयोग करने से भी बचा जाता है।

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