2015-10-17 8 views
8

मैं निम्नलिखित कोड के साथ Stroustrup की this link पढ़ें:ग में Delegating कंस्ट्रक्टर्स ++() या {}

class X { 
     int a; 
    public: 
     X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); } 
     X() :X{42} { } 
     X(string s) :X{lexical_cast<int>(s)} { } 
     // ... 
    }; 

मेरा प्रश्न लाइन के बारे में है:

X() X{42}{}

वहाँ के बीच कोई अंतर है कोष्ठक और घुंघराले ब्रैकेट?
यदि कोई फर्क नहीं पड़ता है तो क्या मैं अन्य फ़ंक्शन कॉल में घुंघराले ब्रैकेट का भी उपयोग कर सकता हूं? या यह सिर्फ कन्स्ट्रक्टर प्रतिनिधिमंडल में है? और अंत में हमारे पास सिंटैक्स दोनों क्यों होना चाहिए? यह थोड़ा अस्पष्ट है।

+1

"क्या मैं अन्य कार्यों के कॉल में घुंघराले ब्रैकेट का भी उपयोग कर सकता हूं या यह केवल कन्स्ट्रक्टर प्रतिनिधिमंडल में है?" - कन्स्ट्रक्टर प्रतिनिधिमंडल एक फंक्शन कॉल नहीं है। आप कभी भी फ़ंक्शन कॉल के साथ '{}' का उपयोग नहीं कर सकते। – emlai

+0

इसे जांचें: http://stackoverflow.com/questions/18222926/why-is-list-initialization-using-curly-braces-better-than-the-alternatives –

उत्तर

7

()value initialization का उपयोग करता है यदि ब्रांड्स खाली हैं, या direct initialization यदि खाली नहीं है।

{}list initialization, जो value initialization तात्पर्य अगर ब्रेसिज़ खाली हैं, या aggregate initialization का उपयोग करता है, तो प्रारंभ वस्तु एक समग्र है।

अपने X चूंकि () या {} के साथ आरंभ करने के बीच कोई अंतर नहीं है एक साधारण int है।

+0

यदि मैं सही समझता हूं तो इसका मतलब है कि अगर मैं 'एक्स'(): एक्स (42) {} 'तो मैं इंटी कन्स्ट्रक्टर को बुला रहा हूं लेकिन अगर मैं' एक्स(): एक्स {42} {} 'लिख रहा हूं तो मैं सिर्फ एक और कन्स्ट्रक्टर को कॉल किए बिना मेमेब्र वैरिएबल शुरू कर रहा हूं? – Govan

+0

@ गोवन - 'int' और' double' जैसे आदिम प्रकार पूर्ण वस्तुएं नहीं हैं। उनके पास रचनाकार नहीं हैं। –

+0

@ डेविड हैममेन मेरा मतलब एक्स (इंटी कन्स्ट्रक्टर) नहीं था जो प्राचीन इंटी कन्स्ट्रियर – Govan

0

प्रारंभिक मान कोष्ठक या ब्रेसिज़ के साथ निर्दिष्ट किया जा सकता है।

ब्रेसिज़ प्रारंभिकरण सी ++ 11 के साथ पेश किया गया था और यह "वर्दी प्रारंभिक" होना है जिसका उपयोग सभी गैर स्थैतिक चर के लिए किया जा सकता है।

ब्रेसिज़ को ब्रांड्स या बराबर चिह्न के स्थान पर उपयोग किया जा सकता है और समानता बढ़ाने और भ्रम को कम करने के लिए पेश किया गया था।

यह केवल एक वाक्य रचनात्मक निर्माण है और इसके परिणामस्वरूप प्रदर्शन लाभ या जुर्माना नहीं होता है।

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