2010-10-24 18 views
7

मान लीजिए मैं एक वर्गनिर्माता

class C { 
     C(int a=10); 
}; 

क्यों अगर मैं

C c; 

contructor C(int =10) कहा जाता है फोन और अगर मैं फोन

C c(); 

डिफ़ॉल्ट निर्माता कहा जाता है? इससे कैसे बचें? मैं केवल अपने कन्स्ट्रक्टर को निष्पादित करना चाहता हूं, मैंने डिफ़ॉल्ट कन्स्ट्रक्टर को निजी बनाने की कोशिश की, लेकिन यह काम नहीं करता है।

+3

के लिए उचित कन्स्ट्रक्टर ट्रिगर करेगा, जो हमें आपके कोड के एक संकलित टुकड़े प्रदान करते हैं जो हमें वह व्यवहार दिखाता है जो आप मानते हैं कि आप देख रहे हैं? जैसा कि आप अब तक उत्तरों से देख सकते हैं, आप जो वर्णन करते हैं वह यह नहीं है कि कोड क्या करना चाहिए। – sbi

+0

बस एक एफवाईआई के रूप में, एमएसवीसी (कम से कम वीएस2003) इस समस्या के बारे में चेतावनी प्रदान करेगा: 'चेतावनी C4930:' सी सी (शून्य) ': प्रोटोटाइप फ़ंक्शन नहीं कहा जाता है (एक परिवर्तनीय परिभाषा थी?)' मैं अन्य कंपाइलर्स को जानता हूं साथ ही, लेकिन इस समय मैं आसानी से उपलब्ध नहीं हूं। –

उत्तर

17
  1. वास्तव में, C c(); एक समारोह घोषणा के रूप में पार्स किया जाना चाहिए। डिफ़ॉल्ट-कन्स्ट्रक्टर को स्पष्ट रूप से आमंत्रित करने के लिए, आपको C c = C(); लिखना होगा।
  2. एक बार जब आप किसी भी निर्माता को परिभाषित कर लेंगे, तो संकलक आपके प्रकार के लिए डिफ़ॉल्ट-निर्माता प्रदान नहीं करेगा, इसलिए कोई भी नहीं कहा जा सकता है।
  3. चूंकि आपके कन्स्ट्रक्टर को एक तर्क के साथ बुलाया जा सकता है, यह एक निहित रूपांतरण फ़ंक्शन के रूप में कार्य करता है। अप्रत्याशित क्षणों पर लात मारने से अंतर्निहित रूपांतरणों को रोकने के लिए आपको इसे explicit बनाने पर विचार करना चाहिए।
+0

@ ग्रेग: धन्यवाद, मुझे यकीन नहीं है कि मैं ऐसा करने में कैसे कामयाब रहा! ':)' – sbi

14

कोड C c(); आप क्या सोचते हैं यह करता है नहीं करता है:

यह एक समारोह c कहा जाता है कि कोई भी तर्क एक C रिटर्न लेता है और घोषणा करता है। यह

C c(void); 
+0

महत्वपूर्ण बात यह है कि यह कुछ भी नहीं करता (रनटाइम व्यवहार के मामले में)। –

1

इसका कारण यह है c()c नाम के एक समारोह के रूप में व्याख्या की है के बराबर है। C()C वर्ग