2010-05-07 11 views
13

जहां तक ​​मुझे पता है, प्रतिलिपि निर्माता T(const T&) या T(T&) रूप का होना चाहिए। अगर मैं हस्ताक्षर में डिफ़ॉल्ट तर्क जोड़ना चाहता हूं तो क्या होगा?डिफ़ॉल्ट तर्कों के साथ प्रतिलिपि बनाने वाला निर्माता

T(const T&, double f = 1.0); 

क्या यह मानक अनुरूप होगा?

+0

देखें [यह पीआर] (http://llvm.org/bugs/show_bug.cgi?id=5989) मैंने कुछ समय पहले कुछ गेमों के साथ खेलने के लिए झुकाव भेजा था। –

+0

http://punchlet.wordpress.com/2009/12/03/letter-the-third/ –

उत्तर

25

हां।

§ [class.copy]/2:

वर्ग X के लिए एक गैर टेम्पलेट निर्माता, अगर अपनी पहली पैरामीटर प्रकार X&, const X&, volatile X& या const volatile X& की है एक प्रतिलिपि निर्माता है और या तो कोई अन्य पैरामीटर नहीं हैं या अन्य सभी पैरामीटर में डिफ़ॉल्ट तर्क [उदाहरण:X::X(const X&) और X::X(X&,int=1) कॉपी कन्स्ट्रक्टर हैं।

6

तुम सिर्फ दो अलग अलग निर्माताओं बना सकते हैं:

T(const T&) 
T(const T&,double) 

हालांकि, तुम्हारे पास क्या है एक प्रति निर्माता के रूप में अनुमति दी है।

एक तरफ ध्यान दें, मैंने पाया है कि सी ++ में डिफ़ॉल्ट पैरामीटर का उपयोग करना आम तौर पर अच्छा विचार नहीं है, और यह अधिभारों का उपयोग करने के लिए बेहतर है, जहां कम पैरामीटर वाले वाले लोग अधिक पैरामीटर के साथ आते हैं, डिफ़ॉल्ट मानों का उपयोग करना (निश्चित रूप से आईएसओ सी ++ 2003 में रचनाकारों के साथ संभव नहीं है, लेकिन आईएसओ सी ++ 201x में कंसल्टर्स को अनुमति देने की अनुमति है)। इसका कारण यह है कि डिफ़ॉल्ट मान आपके कार्यों को उनके स्पष्ट व्यवहार से अलग वास्तविक हस्ताक्षर देते हैं, जिससे फ़ंक्शंस को पॉइंटर्स लेते समय इसे थोड़ा मुश्किल/दर्दनाक बना दिया जाता है। अधिभार प्रदान करके, प्रत्येक संभावित आमंत्रण प्रकार के फ़ंक्शन पॉइंटर्स को इसे बनाने के लिए "बाध्यकारी" तंत्र की आवश्यकता के बिना लिया जा सकता है।

+1

अच्छा बिंदु। अधिभारित कार्यों का पता लेना एक दर्द भी है, आईएमओ, लेकिन कम से कम यह काम करता है। – UncleBens

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