2010-12-08 8 views
6

मैं अपने फाइनल के लिए समीक्षा कर रहा हूं, और मैं यह नहीं समझ सकता कि यह प्रश्न यह क्यों है।सी ++ वर्ग प्रश्न

मान लें निम्नलिखित वर्ग घोषणा:

class Testing { 
public: 
     Testing(int n); 
     void Show(const Testing& w, int a = 10); 
     int value; 
private: 
     int DoThis(); 
}; 

मान लें निम्नलिखित लाइनों कोड का एक मुख्य() कार्यक्रम में प्रयास कर रहे हैं, और है कि एक्स प्रकार Testing की है और propertly बनाया गया है।

x.Show(18); वैध या अवैध

जवाब कानूनी है, मैं समझता हूँ कि 2 पैरामीटर = 10 की वजह से की जरूरत नहीं है, लेकिन 18 के बाद के प्रकार Testing नहीं है नहीं है कि एक अमान्य पैरामीटर?

उत्तर

16

परीक्षण में एक गैर-explicit कन्स्ट्रक्टर है जो एक int लेता है। इसलिए, अस्थायी वस्तु का निर्माण करके एक int को Testing में निहित रूप से परिवर्तित किया जा सकता है।

चूंकि शो const Testing & (और केवल Testing & नहीं) लेता है, तो आप इसे अस्थायी रूप से पास कर सकते हैं। अंत में, दूसरा पैरामीटर वैकल्पिक है, इसलिए आपको इसके लिए कोई मान निर्दिष्ट करने की आवश्यकता नहीं है।

इस पूरे तंत्र क्या आप ऐसा करते हैं, वैसे की अनुमति देता है:

void f(const std::string &str); 
// ... 
f("Hello"); 

यहाँ, "Hello" प्रकार const char (&)[6] है, जो एक const char * को क्षय की है, लेकिन आप इस तरह एक const char * से एक std::string निर्माण कर सकते हैं, const char * के उपयोग की अनुमति जहां std::string पैरामीटर की आवश्यकता है।

ध्यान रखें कि यह एक अस्थायी बनाता है, और इसलिए केवल मानकों या कॉन्स्ट संदर्भ द्वारा पारित पैरामीटर के लिए मान्य है (यह संदर्भों के लिए विफल हो जाएगा)। साथ ही, निर्माता को explicit के रूप में चिह्नित नहीं किया जाना चाहिए।

+0

धन्यवाद, कुछ अच्छे उत्तर थे, लेकिन यह बहुत गहन है। मुझे एक स्पष्टीकरण देने के लिए समय लेने के लिए धन्यवाद। – dubyaa

+0

'हैलो' 'का प्रकार 'कॉन्स्ट चार (&) [6]' है, जो 'const char *' का क्षय होता है। –

3

यहाँ निर्माता:

Testing(int n); 

int से Testing को एक अंतर्निहित रूपांतरण प्रदान करता है, और यह तो Show के लिए प्रोटोटाइप से मेल खाता है, पहले पैरामीटर एक Testing उदाहरण int 18 से निर्मित किया जा रहा है, और दूसरा साथ पैरामीटर डिफ़ॉल्ट मान से 10

जा रहा है आप इस तरह अंतर्निहित रूपांतरण को रोकने के हैं:

explicit Testing(int n); 

कोड संकलित नहीं होगा।

5

क्योंकि Testing में एक निर्माता है जो int स्वीकार करता है, कि सी-टोर का उपयोग पहले पैरामीटर के लिए Testing ऑब्जेक्ट को स्वचालित रूप से बनाने के लिए किया जाता है।

x.Show(Testing(18)); 
6

सी ++ में स्वत: रूपांतरण, implicit conversion sequences कहा जाता है की एक धारणा है: कोड वास्तव में की तरह काम कुछ समाप्त होता है। इस तरह के अनुक्रम में अधिकतम एक रूपांतरण उपयोगकर्ता को परिभाषित किया जा सकता है, और एक अस्थायी वस्तु के लिए एक कन्स्ट्रक्टर को कॉल करना उपयोगकर्ता द्वारा परिभाषित रूपांतरण है।यहां अस्थायी बनाना ठीक है क्योंकि यह कॉन्स्ट-रेफरेंस के लिए बाध्य होगा, और शो() कॉल पूर्ण होने पर नष्ट हो जाएगा।

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