2010-09-02 5 views
8

देखो:फ़ंक्शन नाम और घुंघराले ब्रेसिज़ के बीच सदस्य परिवर्तनीय असाइनमेंट का नाम और कारण क्या है? इस कोड स्निपेट पर

Size::Size(int iSetWidth, int iSetHeight) 
{ 
    iWidth=iSetWidth; 
    iHeight=iSetHeight; 
} 

क्यों आप पूर्व या बाद का प्रयोग करेंगे:

Size::Size(int iSetWidth, int iSetHeight) 
:iWidth(iSetWidth), 
iHeight(iSetHeight) 
{ 
} 

माना जाता है, इस का वही अर्थ है? और पूर्व का नाम क्या है?

उत्तर

17

नहीं, उनका मतलब बिल्कुल वैसा ही नहीं है।

जब कोड नियंत्रक निष्पादित किया जाता है, कोड ब्लॉक (घुंघराले ब्रेसिज़ के बीच कोड) दर्ज करने से पहले, यह सभी ऑब्जेक्ट डेटा सदस्यों को बनाता है। प्रारंभिकरण में आप क्या करते हैं (कोलन के बाद कोड और घुंघराले ब्रेसिज़ से पहले) यह निर्दिष्ट करना है कि कौन से रचनाकार उन सदस्यों के लिए उपयोग करें। यदि आप किसी विशिष्ट डेटा सदस्य के लिए कोई कन्स्ट्रक्टर निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग किया जाएगा।

तो, यदि आप प्रारंभिक सूची (पहला उदाहरण) का उपयोग करते हैं, तो सही निर्माता का उपयोग प्रत्येक सदस्य के लिए किया जाएगा और कोई अतिरिक्त कोड आवश्यक नहीं है। यदि आप नहीं करते हैं, तो पहले डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग किया जाता है और फिर घुंघराले ब्रेसिज़ के अंदर कोड निष्पादित किया जाता है।

सारांश में:

  1. अपने पहले उदाहरण में, प्रत्येक सदस्य उचित निर्माता, शायद प्रतिलिपि निर्माता का उपयोग कर initialised है।
  2. आपके दूसरे उदाहरण में, प्रत्येक सदस्य को डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके बनाया गया है, और उसके बाद कुछ अतिरिक्त कोड इसे प्रारंभ करने के लिए निष्पादित किया जाता है, शायद असाइनमेंट ऑपरेटर।

संपादित करें: क्षमा करें, अंतिम पंक्ति में अपने प्रश्नों का उत्तर देना भूल गए।

कॉलन और घुंघराले ब्रेसिज़ के बीच कोड का नाम प्रारंभिक सूची है।

यदि आप जानते हैं कि एक चर या डेटा सदस्य के लिए सही निर्माता कौन सा है, तो इसका उपयोग करें। यही कारण है कि अधिकांश वर्गों में केवल एक डिफ़ॉल्ट कन्स्ट्रक्टर के बजाय अलग-अलग कन्स्ट्रक्टर होते हैं। तो आप प्रारंभिक सूची का उपयोग कर बेहतर हैं।

प्रारंभिक सूची अन्य तकनीक की तुलना में लगभग धीमी नहीं है, और आसानी से तेज़ी से हो सकती है। कोड लिखते समय एक प्रसिद्ध नियम "समय से पहले अनुकूल नहीं है", लेकिन एक बहुत प्रसिद्ध ज्ञात नहीं है: समय से पहले निराशा न करें। यदि आपके पास कोड का एक टुकड़ा लिखने के लिए दो विकल्प हैं और उनमें से एक दूसरे की तुलना में बेहतर हो सकता है, लेकिन इसमें अतिरिक्त कार्य या जटिलता शामिल नहीं है, तो इसका उपयोग करें। आपके उदाहरण में कोई अंतर नहीं है, क्योंकि आप एक अंतर्निहित प्रकार (int) का उपयोग कर रहे हैं। लेकिन यदि आप कक्षाओं का उपयोग कर रहे थे, तो एक अंतर होगा, इसलिए प्रारंभिक सूची में उपयोग करें।

+1

गोर्पिक ने जो लिखा है उसके अलावा ('+ 1' उसके लिए, बीटीडब्लू): जावा और सी # जैसी भाषाओं में, जहां सभी चर _references_ हैं, इससे कोई फर्क नहीं पड़ता, क्योंकि सदस्य प्रारंभिकरण वैसे भी एक पता असाइनमेंट है। सी ++ में, कक्षा डेटा सदस्य अक्सर वास्तविक वस्तुएं होते हैं, जो ढेर पर वस्तुओं को संदर्भित करने के लिए प्रारंभिक संदर्भ (पॉइंटर्स) के बजाय जगह में प्रारंभ किए जाते हैं। उदाहरण के लिए, 'std :: string' के उचित कार्यान्वयन के लिए, असाइनमेंट के बाद डिफ़ॉल्ट-प्रारंभिकता तुरंत सही डेटा के साथ प्रारंभिक से धीमी हो सकती है। – sbi

+0

@ एसबीआई: सी # में सभी चर संदर्भ नहीं हैं। भाषा के मूल्य-प्रकार भी हैं :) – jalf

+0

@jalf: मैं जानबूझकर चीजों को सरल बना रहा था। – sbi

3

इन्हें पूर्व में इनिटिलाज़ेशन सूचियां कहा जाता है। आप इसके लिए बहुत सारे लेख प्राप्त कर सकते हैं।

सूचियों intializer प्रयोग करने के लिए विशेष रूप से कारणों यहाँ http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

दिया जाता है आप प्रभावी सी उल्लेख कर सकते हैं ++ intializer सूचियों में पूर्ण जानकारी मिलेगी। आशा है कि यह स्पष्ट है।

+2

[इस] की तरह (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6)। –

+0

^^ बहुत अधिक ^^ –

0

Btw, Bjarne Stroustrup में कहा सी ++ प्रोग्रामिंग भाषा कि कुछ दक्षता प्रारंभ की सूची के साथ प्राप्त किया जा सकता है और वह हमें आरंभीकरण सूची का उपयोग करने के लिए सिफारिश!

+1

यदि आप इसके लिए एक संदर्भ प्रदान कर सकते हैं, तो आपको कुछ अपवॉट मिल सकते हैं –

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