2015-11-07 25 views
6

वहाँ एक डिफ़ॉल्ट उपयोगकर्ता परिभाषित निर्माताडिफ़ॉल्ट तर्क के साथ डिफ़ॉल्ट (उपयोगकर्ता परिभाषित) कन्स्ट्रक्टर और कन्स्ट्रक्टर के बीच अंतर?

class Simple 
{ 
public: 
    Simple() {} 
}; 

और उपयोगकर्ता-निर्धारित निर्माता कि कई तर्क है कि WithDefaults भी कर सकते हैं की तुलना में इन

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

अन्य से प्रत्येक के लिए चूक लगता है लेकिन है के बीच कोई अंतर है i के लिए एक स्पष्ट मूल्य के साथ बनाया गया है?

विशेष रूप से, मैं सोच रहा हूं, जहां तक ​​भाषा का संबंध है, यदि ये दो रचनाकार दोनों के लिए डिफ़ॉल्ट कन्स्ट्रक्टर का सटीक रोल खेलते हैं, या कक्षाओं के गुणों के बीच सूक्ष्म मतभेद हैं?

दूसरे शब्दों में, एक निर्माता है जिसमें इसके सभी तर्कों के लिए डिफ़ॉल्ट मान हैं हर तरह से एक डिफ़ॉल्ट कन्स्ट्रक्टर?

+0

मैं यह एक डुप्लिकेट होने की उम्मीद कर रहा था, असल में, लेकिन मुझे यह कहीं भी उत्तर नहीं मिला। – MicroVirus

+0

यह * लगभग * उत्तर दिया गया है [सी ++ कन्स्ट्रक्टर के साथ डिफ़ॉल्ट पैरामीटर] (http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors), मुझे लगता है, लेकिन मुझे यकीन नहीं है। – MicroVirus

+1

अलगाव में, मुझे लगता है, कक्षाएं समान हैं। जब रूपांतरणों को ध्यान में रखा जाता है तो वे अलग-अलग कार्य कर सकते हैं। @MicorVirus द्वारा दूसरी टिप्पणी में लिंक यह और बताता है। –

उत्तर

6

वर्तमान स्टैंडर्ड काम कर मसौदा N4527 [12.1p4]:

एक वर्ग X के लिए एक डिफ़ॉल्ट निर्माता वर्ग X के एक निर्माता है कि या तो कोई पैरामीटर वरना प्रत्येक पैरामीटर है कि एक नहीं दे रहा है फ़ंक्शन पैरामीटर पैक में एक डिफ़ॉल्ट तर्क है। [...]

तो हाँ, दूसरी कक्षा का निर्माता पूरी तरह से वैध डिफ़ॉल्ट कन्स्ट्रक्टर है।


बस एक ध्यान दें कि के सी ++ 11 और 14 प्रकाशित संस्करणों में शब्द थोड़े अलग था, लेकिन अपने प्रश्न के लिए एक फर्क नहीं है।

एक डिफ़ॉल्ट निर्माता एक वर्ग X के लिए वर्ग X के एक निर्माता है कि एक तर्क के बिना कहा जा सकता है: यह हुआ करता था।

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

+0

हालांकि * एबीआई-संगतता पर विचार करने के लिए एक छोटा अंतर है। – Deduplicator

+1

@Deduplicator एक अच्छा बिंदु है, लेकिन मुझे लगता है कि सामान्य कथन के तहत आता है "एक फ़ंक्शन जिसमें सभी मानकों के लिए डिफ़ॉल्ट तर्क होते हैं, उसी वाक्यविन्यास के साथ बुलाया जा सकता है जिसके पास कोई नहीं है, लेकिन इसका मतलब यह नहीं है कि दोनों कार्यों में एक ही हस्ताक्षर है "। – bogdan

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