2012-02-28 8 views
5

संभव डुप्लिकेट:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?इंस्टेंटिएट क्लास के साथ या बिना ब्रांड्स के?

#include <iostream> 
using namespace std; 

class CTest 
{ 
    int x; 

    public: 
    CTest() 
    { 
     x = 3; 
     cout << "A"; 
    } 
}; 

int main() { 
    CTest t1; 
    CTest t2(); 

    return 0; 
} 

CTest t1 प्रिंट निश्चित रूप से 'ए'।

लेकिन ऐसा लगता है कि t2() पर कुछ भी नहीं होता है, लेकिन कोड अच्छी तरह से चलता है।

तो क्या हम तर्क के बिना उन कोष्ठक का उपयोग करते हैं? या हम इसका इस्तेमाल इस तरह क्यों कर सकते हैं?

+0

यह [सबसे अधिक परेशान पार्स] है (http://en.wikipedia.org/wiki/Most_vexing_parse) सी ++ –

+0

@ पीटरवुड में: व्यक्तिगत रूप से, मैं उस पर विवाद करता हूं। ऐतिहासिक रूप से "सबसे परेशान पार्स" केवल उन मामलों के लिए संदर्भित किया जाता है जहां अस्पष्टता प्रारंभकर्ता के साथ होती है जो एक मूल्य प्रारंभिक अस्थायी है, उदाहरण के लिए 'सीटीएस्ट टी 2 (सीटीएस्ट()); इस सरल मामले के बजाय। –

+0

@ चार्ल्सबैली 'सबसे ज्यादा परेशान पार्स से संबंधित' इसे डालने का एक बेहतर तरीका होगा। धन्यवाद। –

उत्तर

14

यह सी ++ वाक्यविन्यास का एक quirk है। लाइन

CTest t1; 

प्रकार CTestt1 नामित की एक स्थानीय चर की घोषणा की। यह निश्चित रूप से डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है। दूसरी ओर, लाइन

CTest t2(); 

नहीं एक चर घोषणा, लेकिन एक समारोह t2 कहा जाता है कि कोई भी तर्क एक CTest रिटर्न लेता है और की एक स्थानीय प्रोटोटाइप है। कारण t2 के लिए कन्स्ट्रक्टर को नहीं कहा जाता है क्योंकि यहां कोई ऑब्जेक्ट नहीं बनाया जा रहा है।

यदि आप ऑब्जेक्ट प्रकार का स्थानीय चर घोषित करना चाहते हैं और डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करना चाहते हैं, तो आपको कोष्ठक को छोड़ना चाहिए।

सी ++ 11 में, आप वैकल्पिक रूप से कह सकते हैं

CTest t2{}; 

कौन वास्तव में डिफ़ॉल्ट निर्माता फोन करता है।

आशा है कि इससे मदद मिलती है!

+8

आपको 'सीटीएस्ट टी 1 के बीच का अंतर ध्यान रखना चाहिए; सीटीएस्ट टी 2 = सीटीएस्ट(); ' –

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