2012-04-11 13 views
7

मैं डेटा संरचनाओं (सूची, ढेर, कतार) का अध्ययन कर रहा हूं, और कोड का यह हिस्सा मुझे भ्रमित कर रहा है।फ़ंक्शन पैरामीटर के भीतर असाइनमेंट ऑपरेटर सी ++

ListNode(const Object& theElement = Object(), ListNode * node = NULL); 


template<class Object> 
ListNode<Object>::ListNode(const Object& theElement, ListNode<Object> * node) { 
    element = theElement; 
    next = node; 
} 
  1. क्यों समारोह मापदंडों के भीतर काम ऑपरेटरों देखते हैं?
  2. Object() कॉल क्या करता है?

उत्तर

15

वे असाइनमेंट ऑपरेटर नहीं हैं। फ़ंक्शन के लिए default arguments हैं।

एक फ़ंक्शन में एक या अधिक डिफ़ॉल्ट तर्क हो सकता है, जिसका अर्थ है कि यदि कॉलिंग बिंदु पर, कोई तर्क प्रदान नहीं किया जाता है, तो डिफ़ॉल्ट का उपयोग किया जाता है।

void foo(int x = 10) { std::cout << x << std::endl; } 

int main() 
{ 
    foo(5); // will print 5 
    foo(); // will print 10, because no argument was provided 
} 

उदाहरण कोड आप पोस्ट में, ListNode निर्माता डिफ़ॉल्ट तर्क के साथ दो पैरामीटर है। पहला डिफ़ॉल्ट तर्क Object() है, जो Object के लिए default constructor पर कॉल करता है। इसका अर्थ यह है कि यदि Object उदाहरण ListNode कन्स्ट्रक्टर को पास किया गया है, तो Object() का डिफ़ॉल्ट उपयोग किया जाएगा, जिसका अर्थ केवल डिफ़ॉल्ट-निर्मित Object है।

यह भी देखें:
Advantage of using default function parameter
Default value of function parameter

+0

मैं वोट करने के लिए परीक्षा रहा हूँ अगर आपको लगता है कि डिफ़ॉल्ट पैरामीटर अधिक "" बुराई सी ++ सुविधाओं में से एक है का उल्लेख होगा। वे रचनाकारों या डिफ़ॉल्ट रचनाकारों को बदलने में निर्दोष रचनाकारों को बदल देते हैं। वे 'बाध्य' कार्यों को मुश्किल बनाते हैं। एक बाधा है जब केवल कुछ पैरामीटर निर्दिष्ट किए जाने चाहिए और अन्य डिफ़ॉल्ट रूप से छोड़े जाते हैं। – pmr

+0

मुझे न तो। एक साइज सबके लिए फ़िट नहीं होता है। कभी-कभी वे बहुत उपयोगी होते हैं। – Spook

+0

@ अपराह्न, मैं आपके साथ जरूरी नहीं हूं कि वे "बुरा" हैं। वे कई रचनाकारों को लिखकर खुद को दोहराने से बचने के लिए एक उपयोगी तरीका हैं, जब आप केवल एक डिफ़ॉल्ट पैरामीटर के साथ एक कन्स्ट्रक्टर प्रदान कर सकते हैं। मानक लाइब्रेरी कार्यान्वयन अक्सर इसका लाभ उठाते हैं, उदा। 'वेक्टर (const allocator_type और a = allocator_type());' –

3

घोषणाओं में कार्य वैकल्पिक पैरामीटर के लिए डिफ़ॉल्ट मान प्रदान करते हैं। Object() का मतलब है Object का डिफ़ॉल्ट कन्स्ट्रक्टर।

डिफ़ॉल्ट पैरामीटर का प्रभाव निम्नानुसार है: आप शून्य, एक या दो पैरामीटर के साथ ListNode कन्स्ट्रक्टर का आह्वान कर सकते हैं। यदि आप दो पैरामीटर अभिव्यक्ति निर्दिष्ट करते हैं, तो वे सामान्य रूप से पारित होते हैं। यदि आप केवल एक अभिव्यक्ति निर्दिष्ट करते हैं, तो इसका मान पहले पैरामीटर के रूप में पारित किया जाता है, और दूसरा को NULL पर डिफ़ॉल्ट कर दिया जाता है। यदि आप कोई पैरामीटर पास नहीं करते हैं, तो पहला पैरामीटर Object के उदाहरण के लिए डिफॉल्ट कन्स्ट्रक्टर के साथ डिफॉल्ट किया गया है, और दूसरा को NULL पर डिफॉल्ट किया गया है।

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