C ++ में प्रोग्रामिंग(programming) 8 के मॉड्यूल(module) 8 में आपका स्वागत है। हम C ++ के बेहतर सी फीचर्स कर रहे हैं, हमने पहले ही const और वाष्पशील(volatile) और मैक्रोज़(macros), इनलाइन फ़ंक्शंस के बारे में बात की है और रेफ़रेंस वैरिएबल और रेफरेंस बाय कॉल और रेफरेंस मेकेनिज्म द्वारा लौटाया है। ये सभी C ++ की बेहतर C विशेषताएँ हैं। हम अब इस मॉड्यूल(module) 8 में, डिफ़ॉल्ट(default) पैरामीटर्स(parameters) और फंक्शन(function) ओवरलोडिंग(overloading) के बारे में बात करेंगे। C ++ भाषा के ऑब्जेक्ट ओरिएंटेड गुणों को सक्षम करने के लिए दो बहुत ही महत्वपूर्ण विशेषताएं हैं जो एक लंबा रास्ता तय करती हैं। यह इस मॉड्यूल(module) की समग्र रूपरेखा होगी जिसे आप प्रस्तुति के बाएँ पैनल पर देखते रहेंगे। तो, अब हम आरंभ करते हैं। अब, पहले हम डिफ़ॉल्ट(default) पैरामीटरस(parameters) के बारे में चर्चा करेंगे और मैं C से एक उदाहरण के साथ शुरू करता हूं विशेष रूप से यह MSDN, विंडोज़(windows) प्रोग्रामिंग(programming) से एक उदाहरण है। यदि आप एक ग्राफिक्स प्रोग्रामिंग(programming) और खिड़कियों से परिचित हैं, तो आपने इस फ़ंक्शन(function) को देखा होगा, यदि आपने इसे नहीं देखा है, तो यह वास्तव में कोई फर्क नहीं पड़ता। जो कुछ मैं बाएं कॉलम पर दिखाना चाहता हूं वह है create window फ़ंक्शन(function) का प्रोटोटाइप(prototype) या हेडर। आप देख सकते हैं कि फ़ंक्शन(function) में बड़ी संख्या है; विशेष रूप से, प्रोटोटाइप(prototype) में इसके विनिर्देशन के लिए 11 अलग-अलग पैरामीटर(parameter)। जब आपको एक ग्राफिक्स विंडो(window) बनाने की आवश्यकता होती है, तो आपको विंडो(window) बनाने के लिए इन सभी 11 पैरामीटरस(parameters) को निर्दिष्ट करना होगा। दाहिने कॉलम पर मैं विंडो(window) बनाने के लिए एक विशिष्ट बनाएँ विंडो(window) कॉल दिखाता हूँ। अब, यदि आप इस विशेष कार्य पर विचार करेंगे तो आप दो चीजें देख सकते हैं; एक यह है कि बड़ी संख्या में पैरामीटर(parameter), 11 पैरामीटर(parameter) हैं और इसका उपयोग करने में सक्षम होने के लिए आपको आमतौर पर यह जानना होगा कि इन 11 पैरामीटरस(parameters) का क्या मतलब है और आपको उन पैरामीटरस(parameters) को निर्दिष्ट करने की आवश्यकता होगी। अब, अक्सर आप केवल एक नमूना विंडो(window) बनाना चाहते हैं, आप बस एक ऐसी विंडो(window) चाहते हैं जिसमें एक डिफ़ॉल्ट(default) पृष्ठभूमि का रंग, डिफ़ॉल्ट(default) पाठ का रंग हो, आप इसे मॉनिटर में एक डिफ़ॉल्ट(default) केंद्र स्थान पर चाहते हैं, आप चाहते थे कि यह एक डिफ़ॉल्ट(default) चौड़ाई और ऊंचाई हो। और इसी तरह। यह देखते हुए कि आप आवश्यक नहीं होंगे कि आप सभी विशिष्ट मूल्यों को निर्दिष्ट करेंगे; इन 11 पैरामीटरस(parameters) में आपके अनुप्रयोगों के लिए अलग। इसलिए, यह सुनिश्चित करने के लिए कि यदि आप वास्तविक कॉल को देखते हैं, तो आप देखेंगे कि कॉल में कई पैरामीटर(parameter) हैं जैसे; यदि आप यहां पैरामीटरस(parameters) को देखते हैं, तो ये ऐसे पैरामीटर(parameter) हैं जो मूल रूप से प्रकट स्थिरांक हैं, सीडब्ल्यू(CW) क्रिएट(create) विंडो(window) डिफ़ॉल्ट(default) बनाने के लिए खड़ा है। यह कह रहा है कि पुस्तकालय(library) में पहले से ही परिभाषित कुछ डिफ़ॉल्ट(default) मूल्य है ताकि आप उन मूल्यों का उपयोग कर सकें। इसलिए मूल रूप से, आप उन मूल्यों की आपूर्ति नहीं कर रहे हैं। इसी तरह, यदि आप विंडो(window) पेरेंट और मेन्यू में देखते हैं या यदि आप विंडो(window) पैरामीटर्स(parameters) में देख रहे हैं, तो हम केवल अशक्त हो रहे हैं, जो मूल रूप से फिर से एक डिफ़ॉल्ट(default) मान का एक प्रकार है। hInstance, विंडो(window) का उदाहरण। यदि आप विंडो(window) प्रोग्रामिंग(programming) जानते हैं, तो आपको पता होगा कि आपके एप्लिकेशन का एक उदाहरण है, जिसमें एक प्रकार का डिफ़ॉल्ट(default) मान भी मिलता है इसलिए विंडो(window) के प्रकार के साथ भी ऐसा ही है जो आप बना रहे हैं कि आप एक ओवेरलाप विंडो(window) बना रहे हैं और इसी तरह। भले ही ये 11 पैरामीटर(parameter) फ़ंक्शन(function) में हैं और आपको उनमें से सभी को निर्दिष्ट करने की आवश्यकता है, उनमें से कई को लाइब्रेरी द्वारा डिफ़ॉल्ट(default) मान दिए गए हैं या शून्य के रूप में पारित किए गए हैं और आपको वास्तव में कुछ चीजें निर्दिष्ट करने की आवश्यकता है जैसे कि आपका विंडो(window) क्लास क्या है जो परिभाषित करता है कि क्या एक विशिष्ट संरचना जो आप कर रहे हैं और संभवतः यह कॉल करने के लिए विंडो(window) का नाम। लेकिन फिर भी, आपको कॉल में वास्तव में लिखे जाने के लिए सभी ग्यारह पैरामीटरस(parameters) की पूरी श्रृंखला की आवश्यकता है। यह अच्छा होता कि यदि आप पैरामीटरस(parameters) को एक तरह से व्यवस्थित कर सकें, ताकि आपके कॉल के लिए निर्दिष्ट किए जाने वाले पैरामीटरस(parameters) को केवल कॉल दृष्टि पर दिए जाने की आवश्यकता हो। यदि सिस्टम आपके लिए कुछ डिफ़ॉल्ट(default) मानों को निर्दिष्ट किए बिना आम तौर पर डिफ़ॉल्ट(default) पैरामीटरस(parameters) को समझ और ले सकता है, तो हर बार जब आप उस कॉल को करते हैं। इसलिए, C ++ हमें इस संबंध में कुछ करने की अनुमति देता है और उस सुविधा को डिफ़ॉल्ट(default) पैरामीटर(parameter) के रूप में जाना जाता है। अब, यहाँ एक उदाहरण है कि डिफ़ॉल्ट(default) पैरामीटरस(parameters) का क्या मतलब है। इस फ़ंक्शन(function) पर विचार करें, कार्यक्षमता वास्तव में बहुत महत्वपूर्ण नहीं है, हम इसे IdentityFunction के रूप में बुला रहे हैं, यह एक पैरामीटर(parameter) लेता है और बस उसी पैरामीटर(parameter) को वापस लौटाता है। लेकिन जिस चीज को हम उजागर करना चाहते हैं, उसके लिए आपको यहां क्या देखना होगा, क्या पैरामीटर(parameter) पैरामीटर(parameter) फ़ंक्शन(function) के हस्ताक्षर में दिया गया मान है, पैरामीटर(parameter) के प्रारंभिक मूल्य की तरह। अब, हम समझते हैं कि एक निश्चित दायरे में एक चर का प्रारंभिक मूल्य क्या है, एक पैरामीटर(parameter) के लिए एक प्रकार का प्रारंभिक या डिफ़ॉल्ट(default) होने का क्या अर्थ है। यह समझने के लिए कि हमें कॉल करें, कॉल देखें, फ़ंक्शन(function) की पहली कॉल पर ध्यान दें। फ़ंक्शन(function) की पहली कॉल सामान्य रूप से हम पहचान फ़ंक्शन(function) को वास्तविक पैरामीटर(parameter) x के साथ कॉल कर रहे हैं, जिसका वर्तमान में 5 मान है, इसलिए हम उस पैरामीटर(parameter) को यहां पास कर रहे हैं और इसलिए यह उसी मान को लौटाएगा और जैसा कि आप इस लाइन से आउटपुट(output) करते हैं और आपको मिलेगा इस बिंदु पर आउटपुट(output) की पहली पंक्ति। इस बिंदु तक कोई आश्चर्य नहीं है। अब, उसी फ़ंक्शन(function) के दूसरे कॉल पर ध्यान केंद्रित करते हैं। आपको यह जानकर आश्चर्य होगा कि अब मैं बिना किसी पैरामीटर(parameter) को पारित किए इस फ़ंक्शन(function) को कॉल कर सकता हूं। हम अभी तक सी में हैं, हमेशा ज्ञात है कि वास्तविक पैरामीटरस(parameters) की संख्या और औपचारिक पैरामीटरस(parameters) की संख्या को कॉल और फ़ंक्शन(function) के प्रोटोटाइप(prototype) के बीच मेल खाना चाहिए। वास्तविक पैरामीटर(parameter) और औपचारिक पैरामीटरस(parameters) को उनके क्रम में, उनके डेटा प्रकार में और इसी तरह मेल खाना चाहिए। लेकिन यहां, फ़ंक्शन(function) का वास्तव में एक पैरामीटर(parameter) है, लेकिन जब मैं यहां कॉल करता हूं तो मैं उस पैरामीटर(parameter) को निर्दिष्ट नहीं कर रहा हूं। यह वही है जो डिफ़ॉल्ट(default) पैरामीटर(parameter) सुविधा है। C ++ क्या करता है? चूंकि आपने बिना किसी पैरामीटर(parameter) के कॉल किया है और चूंकि फ़ंक्शन(function) पहले से ही पैरामीटर(parameter) मान डिफ़ॉल्ट(default) मान 10 के साथ परिभाषित किया गया है, इसलिए यह मान लेगा कि आपके पास इस फ़ंक्शन(function) को इस डिफ़ॉल्ट(default) मान के साथ कहा जाता है। इसलिए, यदि आप एक पैरामीटर(parameter) को डिफ़ॉल्ट(default) करते हैं तो आपको वास्तव में दो विकल्प मिलते हैं; एक, जैसा कि आप यहां प्राप्त करते हैं, जहां आप फ़ंक्शन(function) कॉल ठीक उसी तरह से कर सकते हैं जिस तरह से आप फ़ंक्शन(function) कॉल कर रहे हैं, यह निर्दिष्ट करते हुए कि क्या वास्तविक पैरामीटर(parameter) है, या आप पैरामीटर(parameter) के डिफ़ॉल्ट(default) मान का उपयोग करके एक विकल्प बना सकते हैं और वास्तविक निर्दिष्ट करने की आवश्यकता नहीं है। पैरामीटर(parameter) आप बस इसे छोड़ सकते हैं। सिस्टम समझ जाएगा कि आप पैरामीटर(parameter) का उपयोग कर रहे हैं और फ़ंक्शन(function) घोषणा में डिफ़ॉल्ट(default) रूप से दिए गए मान को निर्दिष्ट करते हैं। तो, यह डिफ़ॉल्ट(default) पैरामीटर(parameter) की मूल विशेषता है। आइए अब आगे बढ़ते हैं और एक और उदाहरण लेते हैं। अंतिम उदाहरण में, हमने एक फ़ंक्शन(function) दिखाया जिसमें एक डिफ़ॉल्ट(default) पैरामीटर(parameter) है और अब हम दिखा रहे हैं कि यह आवश्यक नहीं है कि आपके पास केवल एक डिफ़ॉल्ट(default) पैरामीटर(parameter) होगा जो आपके पास वास्तव में डिफ़ॉल्ट(default) पैरामीटर(parameter) तक हो सकता है या डिफ़ॉल्ट(default) पैरामीटरस(parameters) की कोई भी मनमानी संख्या भी। हम यहां केवल एक फ़ंक्शन(function) दिखाते हैं, कृपया इसकी कार्यक्षमता, इस के लिए एल्गोरिदम के बारे में चिंतित न हों, यह केवल दो पैरामीटरस(parameters) को जोड़ता है और उन्हें वापस लौटाता है, बस यहां इस फ़ंक्शन(function) की परिभाषा को देखें, और इसमें दो पैरामीटर(parameter) हैं पूर्णांक; int a और int b। और हमने जो भी किया है, उनमें से प्रत्येक पैरामीटर(parameter) को प्रारंभिक मूल्य के साथ डिफ़ॉल्ट(default) किया गया है। तो, इसके साथ, जब हम इस फ़ंक्शन(function) का उपयोग करते हैं और कॉल करते हैं यदि आप यहां पहली कॉल देखते हैं, तो पहला कॉल एक सामान्य फ़ंक्शन(function) कॉल है, x और y दो वास्तविक पैरामीटर(parameter) हैं। हम ऐड(x,y) कहते हैं, इसलिए x वहां 'a' से मेल खाता है, यह वैल्यू बाय कॉल है, जैसा कि आप देख सकते हैं, y को b से कॉपी किया गया है और x और y के मान के साथ फंक्शन(function) को 5 और 6 और इसलिए जब आप यहाँ राशि को प्रिंट करते हैं तो हमें पहला आउटपुट(output) मिलता है जो कि 11 निकला है। अब, उसी फ़ंक्शन(function) के दूसरे कॉल को देखें। इस फ़ंक्शन(function) की दूसरी कॉल में, हम पहला पैरामीटर(parameter) x प्रदान करते हैं, लेकिन हमने दूसरा पैरामीटर(parameter) प्रदान नहीं किया है, जिसका अर्थ है कि फ़ंक्शन(function) वास्तव में दो पैरामीटर(parameter) थे, जिसे हम एक पैरामीटर(parameter) के साथ बुला रहे हैं। तो, क्या होगा? यह एक पैरामीटर(parameter) जो हमने प्रदान किया है जो x के अनुरूप होगा, औपचारिक पैरामीटर(parameter) के अनुरूप होगा, इसलिए जो भी x का मूल्य है वह औपचारिक पैरामीटर(parameter) a के मान से कॉल में कॉपी हो जाएगा। लेकिन दूसरा पैरामीटर(parameter) प्रदान नहीं किया गया है, इसलिए सिस्टम समझ जाएगा कि आप दूसरे पैरामीटर(parameter) के डिफ़ॉल्ट(default) मान का उपयोग कर रहे हैं, अर्थात, दूसरा पैरामीटर(parameter) 20 लिया जाएगा क्योंकि दूसरे पैरामीटर(parameter) में दिए गए एक डिफ़ॉल्ट(default) मान 20 है। इसलिए, इस मामले में फ़ंक्शन(function) ‘a’ 5 है और ‘b' 10 होने के साथ आगे बढ़ेगा और यह गणना करेगा और आप आउटपुट(output) से देख सकते हैं, a + b 25 होने की गणना करेगा और वही मुद्रित होगा। हम इसे और आगे बढ़ा सकते हैं। यह हम कॉल के तीसरे उदाहरण में करते हैं जहां हमने कोई वास्तविक पैरामीटर(parameter) प्रदान नहीं किया है। इसलिए, फ़ंक्शन(function) a और b दोनों के दो पैरामीटरस(parameters) को उनके डिफ़ॉल्ट(default) मान लिया जाता है, वह है `a' 10 है और ‘b’ 20 है और यहां फ़ंक्शन(function) यह वास्तव में दिखाई नहीं देता है, लेकिन यहां फ़ंक्शन(function) 30 को कुछ परिणाम के रूप में प्रिंट करता है। हम यह देख सकते हैं कि, यह आवश्यक नहीं है कि मैं केवल एक पैरामीटर(parameter) को डिफ़ॉल्ट(default) करूं, लेकिन यह संभव है कि मैं एक फ़ंक्शन(function) में एक मनमाने ढंग से पैरामीटरस(parameters) की संख्या को डिफ़ॉल्ट(default) कर सकता हूं। और यह वह है जो बड़ी संख्या में पैरामीटरस(parameters) के साथ विशेष रूप से लेखन कार्यों में बहुत उपयोगी होगा, जहां पैरामीटरस(parameters) का एक अच्छा सेट अक्सर साथ काम करने के लिए डिफ़ॉल्ट(default) मान ले सकता है। हम डिफ़ॉल्ट(default) पैरामीटरस(parameters) के बारे में बुनियादी बिंदुओं पर प्रकाश डालेंगे, जो कि C ++ प्रोग्रामर को फ़ंक्शन(function) पैरामीटरस(parameters) के लिए डिफ़ॉल्ट(default) मान असाइन करने की अनुमति देता है, आपने यह देखा है। फ़ंक्शन(function) को प्रोटोटाइप(prototype) करते समय डिफ़ॉल्ट(default) मान निर्दिष्ट किए जाते हैं। फ़ंक्शन(function) को प्रोटोटाइप(prototype) करना, जो कि एक मतलब है आप फ़ंक्शन(function) हस्ताक्षर में डिफ़ॉल्ट(default) मान लिखते हैं जैसा हमने देखा है। फ़ंक्शन(function) को कम तर्कों के साथ या बिना किसी तर्क के डिफ़ॉल्ट(default) पैरामीटर(parameter) की आवश्यकता होती है, इसलिए हमने देखा है कि कॉल साइट में गायब होने पर उनके डिफ़ॉल्ट(default) मान के साथ एक या दो पैरामीटर(parameter) का उपयोग कैसे किया जाता है। जैसाएक अभ्यास, निश्चित रूप से यह नहीं कहा जा सकता है कि कौन से पैरामीटर(parameter) डिफ़ॉल्ट(default) होने चाहिए और कौन से पैरामीटर(parameter) डिफ़ॉल्ट(default) नहीं होने चाहिए। लेकिन एक अभ्यास के रूप में, कम उपयोग किए गए पैरामीटरस(parameters) के लिए डिफ़ॉल्ट(default) मान का उपयोग करना अच्छा होगा, जबकि आप वास्तव में सभी पैरामीटरस(parameters) के लिए डिफ़ॉल्ट(default) मान का उपयोग कर सकते हैं यदि आप चाहें तो। डिफ़ॉल्ट(default) तर्क, जब आप फ़ंक्शन(function) को डिफ़ॉल्ट(default) तर्क कहते हैं या यहां तक कि डिफ़ॉल्ट(default) मान भी अभिव्यक्ति हो सकते हैं जब तक कि उन्हें संकलन समय पर गणना की जा सकती है। मेरे पास डिफ़ॉल्ट(default) मान के रूप में 2 +3 जैसे डिफ़ॉल्ट(default) मान हो सकते हैं। यह एक फ़ंक्शन(function) के लिए मान्य होगा, मेरे पास 2+ 3 की तरह एक डिफ़ॉल्ट(default) मान हो सकता है, कंपाइलर क्या करेगा, यह 2 +3 की गणना करेगा, जबकि यह संकलन है और यह डिफ़ॉल्ट(default) मान को 5 के रूप में सेट करेगा। लेकिन कृपया ध्यान दें कि मैं एक डिफ़ॉल्ट(default) मान नहीं हो सकता है जो वास्तव में संकलन के समय एक अभिव्यक्ति है कि मैं ऐसा कुछ नहीं कह सकता, 2 + एन, जब तक कि एन को एक निरंतर मूल्य, निरंतर पूर्णांक नहीं कहा जाता है। क्योंकि अगर n वेरिएबल है तो कंपाइलर को आपके प्रोग्राम को कंपाइल करने के समय पता नहीं होता है कि आप क्या डिफॉल्ट वैल्यू दे रहे हैं। अब, अगला हम यह देखने की कोशिश करेंगे कि क्या यह किसी फ़ंक्शन(function) के पैरामीटरस(parameters) को किसी भी तरह से डिफ़ॉल्ट(default) कर सकता है, जो मैं चाहता हूं, या कुछ बुनियादी नियम या प्रतिबंध हैं जिनका हमें पालन करना होगा । इसलिए, हम एक डिफ़ॉल्ट(default) पैरामीटरस(parameters) के कुछ बुनियादी नियमों को डिस्कस करते हैं। पहला नियम बहुत महत्वपूर्ण है यह कहता है कि डिफ़ॉल्ट(default) तर्क के साथ एक पैरामीटर(parameter) के दाईं ओर सभी पैरामीटरस(parameters) को डिफ़ॉल्ट(default) तर्क होना चाहिए। इस नियम के लिए, इस विशेष फ़ंक्शन(function) को देखें। हम फ़ंक्शन(function) च के बारे में बात कर रहे हैं जिसमें चरित्र के तीन पैरामीटर(parameter) हैं, इंट, डबल और पॉइंटर। इस मामले में हमने दूसरे पैरामीटर(parameter) के लिए एक डिफ़ॉल्ट(default) मान प्रदान किया है, क्यों हमने तीसरे पैरामीटर(parameter) को कोई डिफ़ॉल्ट(default) मान प्रदान नहीं किया है जो char* है। यदि आप ऐसा करते हैं तो संकलक आपको एक त्रुटि देगा और इस मामले में, मैंने एक संकलक से त्रुटि दिखाई है, जो कहता है कि f में पैरामीटर(parameter) तीन के लिए डिफ़ॉल्ट(default) पैरामीटर(parameter) गायब है जो इस पैरामीटर(parameter) के लिए है। तो, यह कहता है कि यदि मैं कोई फ़ंक्शन(function) लिखता हूं और अगर मेरे पास एक पैरामीटर(parameter), दो पैरामीटर(parameter), तीन पैरामीटर(parameter) हैं, और यदि कुछ पैरामीटर(parameter) डिफ़ॉल्ट(default) है, तो सभी पैरामीटर(parameter) जो मैं इस डिफ़ॉल्ट(default) पैरामीटर(parameter) के बाद लिखता हूं उन सभी को एक बार यह डिफ़ॉल्ट(default) रूप से अगले एक है डिफ़ॉल्ट(default) होना है; अगले को भी हम सभी को डिफॉल्ट करना होगा अंत तक हमें डिफॉल्ट करना होगा। अन्यथा, कंपाइलर यह निर्धारित नहीं कर पाएगा कि आप वास्तव में किन पैरामीटरस(parameters) का उपयोग कर रहे हैं। तो यह पहला नियम है, कि एक बार जब हम एक पैरामीटर(parameter) को डिफ़ॉल्ट(default) करते हैं तो यह सही है कि सभी पैरामीटर(parameter) मौजूद हैं जो डिफ़ॉल्ट(default) मान प्राप्त करना चाहिए। जैसा कि यहां है दूसरा नियम, डिफ़ॉल्ट(default) पैरामीटर(parameter) को फिर से परिभाषित नहीं किया जा सकता है। तुम देखो, इन दो पंक्तियों को कहो। यहां, सबसे पहले हमने एक फंक्शन(function) एफ को परिभाषित किया है जिसमें तीन पैरामीटर(parameter) फिर से हैं, इंट, डबल और char*, और दो पैरामीटरस(parameters) को दूसरे पैरामीटर(parameter) को 0 और तीसरे पैरामीटर(parameter) को एक शून्य पॉइंटर में डिफॉल्ट किया गया है, यह ठीक है, सहज रूप में। बाद में, हम फिर से उसी फ़ंक्शन(function) प्रोटोटाइप(prototype) जी के बारे में बात कर रहे हैं, लेकिन, यदि आप इन दो मूल्यों को देखते हैं, तो हम अब दूसरे पैरामीटर(parameter) के लिए एक अलग डिफ़ॉल्ट(default) मान का उपयोग कर रहे हैं। तो, यह अनुमति नहीं है, आप केवल एक बार किसी फ़ंक्शन(function) के पैरामीटर(parameter) मान को डिफ़ॉल्ट(default) कर सकते हैं। एक बार जब आप चूक गए हैं तो आप फिर से डिफ़ॉल्ट(default) पैरामीटर(parameter) मान निर्दिष्ट नहीं कर सकते। अब आप सोचते हैं कि यह अस्पष्टता है, इस तथ्य से कि आपने डबल से शून्य तक डिफॉल्ट किया है और फिर आपने डबल को डिफॉल्ट किया है यदि आप इसे ध्यान से देख रहे हैं कि आपने दो डिफॉल्ट मानों का उपयोग किया है और यही कारण है कि कंपाइलर है यह त्रुटि जो यहां पैरामीटर(parameter) दो पर त्रुटि के रूप में दिखाई गई है, लेकिन संयोगवश संकलक वास्तव में आपके द्वारा प्रदान किए गए डिफ़ॉल्ट(default) के वास्तविक मूल्य को नहीं देखता है। इसे समझने के लिए, कृपया तीसरे पैरामीटर(parameter) के डिफ़ॉल्ट(default) मान पर अपना ध्यान केंद्रित करें। यहां तीसरा पैरामीटर(parameter) शुरू में पहले मामले में अशक्त होने के लिए दिया गया था और दूसरा मामला इसे फिर से शून्य होने के लिए फिर से परिभाषित किया गया है ताकि आप वास्तव में अगली बार में उसी डिफ़ॉल्ट(default) मान का उपयोग कर रहे हों। लेकिन फिर भी, कंपाइलर भ्रमित हो जाता है और आपको बताएगा कि, पैरामीटर(parameter) तीन के लिए डिफ़ॉल्ट(default) पैरामीटर(parameter) को फिर से परिभाषित किया गया है, यह पहले से ही परिभाषित किया गया था और इसे फिर से परिभाषित किया जा रहा है और इसे अनुमति नहीं दी जाएगी। इससे कोई फर्क नहीं पड़ता कि क्या आप उसी मान से डिफ़ॉल्ट(default) मान को फिर से परिभाषित कर रहे हैं जिसे आप पहले परिभाषित कर रहे हैं या आप एक अलग मूल्य का उपयोग करके डिफ़ॉल्ट(default) मान को फिर से परिभाषित कर रहे हैं जिसे आप पहले उपयोग कर रहे हैं, दोनों ही मामलों में इसकी अनुमति नहीं होगी। इसलिए, डिफ़ॉल्ट(default) फ़ंक्शंस को उन फ़ंक्शंस के लिए पुनर्परिभाषित नहीं किया जा सकता है जहां आप डिफ़ॉल्ट(default) पैरामीटर(parameter) का उपयोग कर रहे हैं, यह नियम नंबर दो है। तीसरा नियम जो कहता है कि चूंकि आप डिफ़ॉल्ट(default) पैरामीटरस(parameters) का उपयोग कर रहे हैं, आप उन्हें कॉल के समय निर्दिष्ट करने के लिए चुन सकते हैं या आप कॉल के समय उन्हें निर्दिष्ट नहीं कर सकते। इसलिए, यदि हम फ़ंक्शन(function) जी के संदर्भ में देखते हैं, तो इस विशेष परिभाषा को कहें जो निश्चित रूप से एक सही परिभाषा है तो हम देख सकते हैं कि ये तीन कॉल मान्य हैं, यही है कि मैं फ़ंक्शन(function) को एक इंट पैरामीटर(parameter) g(i) के साथ कॉल कर सकता हूं जिसे पहले के रूप में लिया जाएगा या मैं इसे पहले दो पैरामीटरस(parameters) i और d के साथ कह सकता हूं जो कि int और double है या मैं इसे तीनों पैरामीटरस(parameters) के साथ कह सकता हूं। वे तीनों ठीक हैं। मान लीजिए, यदि आप फ़ंक्शन(function) जी को बिना किसी पैरामीटर(parameter) के कॉल करने का प्रयास करते हैं, तो यह एक त्रुटि होगी, क्योंकि यदि आपको इस फ़ंक्शन(function) को बिना किसी पैरामीटर(parameter) के कॉल करना है, तो पहले पैरामीटर(parameter) को डिफ़ॉल्ट(default) होना चाहिए था जो इस मामले में नहीं किया गया है। तो, यह कहता है कि यदि किसी फ़ंक्शन(function) के कुछ पैरामीटरस(parameters) को डिफ़ॉल्ट(default) मान दिया जाता है, तो कम से कम सभी गैर-डिफ़ॉल्ट(default) पैरामीटरस(parameters) को वास्तविक पैरामीटर(parameter) और डिफ़ॉल्ट(default) पैरामीटरस(parameters) के रूप में निर्दिष्ट किया जाना चाहिए, डिफ़ॉल्ट(default) पैरामीटरस(parameters) के मामले में आपके पास एक विकल्प है और आप निर्दिष्ट कर सकते हैं उनमें से कोई भी या उनमें से कुछ नहीं, लेकिन यदि आप उनमें से कुछ को निर्दिष्ट करते हैं तो आपको हमेशा उस नियम का पालन करना होगा, यानी आपको उन्हें बाएं से दाएं क्रम में निर्दिष्ट करना होगा। मेरे कहने का मतलब यह है कि मैं यहाँ निर्दिष्ट कर रहा हूँ यदि आप इस विशेष विनिर्देश को देखते हैं तो मुझे साफ़ करें और फिर से दिखाएं, मान लें कि आप इस कॉल में देख रहे हैं, यहाँ फ़ंक्शन(function) के तीन पैरामीटर(parameter) हैं लेकिन हम इस दो को निर्दिष्ट कर रहे हैं। तो, उनमें से पहला मैं निश्चित रूप से गैर-डिफ़ॉल्ट(default) पैरामीटर(parameter) है जो अनिवार्य रूप से आवश्यक है और दूसरा पैरामीटर(parameter) जो आपके द्वारा निर्दिष्ट किया गया है वह डबल होने के लिए लिया गया है। अब, मान लीजिए कि आपने i, & c जैसी कॉल करने की कोशिश की है और यह सोचकर कि इस कॉल का मतलब होगा कि मैं इंट के लिए जाऊंगा, यह तीसरे पैरामीटर(parameter) चार * के लिए जाएगा और बीच में डबल मान 0.0 के रूप में लिया जाएगा। यह संभव नहीं होगा, यह एक त्रुटि है। कारण यह है कि संकलक के पास यह जानने का कोई तरीका नहीं है कि दो डिफ़ॉल्ट(default) पैरामीटरस(parameters) के बीच डबल और चार * जो आप यहां निर्दिष्ट कर रहे हैं और कौन सा आप यहां निर्दिष्ट कर रहे हैं। यह मानने के लिए क्या है कि, यदि आप इन पैरामीटरस(parameters) का उपयोग कर रहे हैं, तो आप एक विशेष क्रम में डिफ़ॉल्ट(default) मानों का उपयोग कर सकते हैं, जो कि कॉल में वास्तव में दिए गए पैरामीटरस(parameters) को बाएं से दाएं से मेल खाना है, यह केवल एक बिंदु के बाद ही आप छोड़ सकते हैं उस औपचारिक पैरामीटर(parameter) के दाईं ओर सभी पैरामीटर(parameter), लेकिन बीच से कुछ छोड़ें नहीं। तो, ये कुछ बुनियादी नियम हैं जिनका डिफ़ॉल्ट(default) पैरामीटरस(parameters) का पालन करना है। यहाँ, हम एक और दिखाते हैं; यह भाषा की परिभाषा से बिल्कुल नियम नहीं है, लेकिन मैं इसे केवल इस तरह दिखाता हूं कि डिफ़ॉल्ट(default) पैरामीटर(parameter) का उपयोग करते हुए आपको किस तरह अभ्यास करना चाहिए। इसलिए, वह कह रहा है कि डिफ़ॉल्ट(default) पैरामीटर(parameter) केवल हेडर फ़ाइल में दिए जाने चाहिए और फ़ंक्शन(function) की परिभाषा में नहीं, यदि आप एक डिफ़ॉल्ट(default) पैरामीटर(parameter) कर रहे हैं तो यह ऐसा है जैसे कि आपके पास एक डिफ़ॉल्ट(default) फ़ाइल है जहां आपने डिफ़ॉल्ट(default) निर्दिष्ट किया है यह परिभाषा फ़ाइल स्रोत फ़ाइल है जहाँ आपने उस फ़ंक्शन(function) को परिभाषित किया है जो उस फ़ंक्शन(function) के लिए निकाय प्रदान करता है। तो हम जो कह रहे हैं वह यह है कि आप कभी भी किसी भी डिफ़ॉल्ट(default) पैरामीटर(parameter) को यहां या कहीं और निर्दिष्ट न करें जहां आप इस फ़ंक्शन(function) का उपयोग कर रहे हैं। अब, यह समझने के लिए कि हमें क्या हो रहा है, इस फ़ंक्शन(function) को परिभाषित किया गया है कि प्रोटोटाइप(prototype) हेडर में दिया गया है और यह एक एप्लीकेशन कोड है यह एक एप्लीकेशन कोड है जो उस फ़ंक्शन(function) का उपयोग कर रहा है ताकि इसमें वह हेडर शामिल हो जिसका अर्थ है कि यह विशेष फ़ंक्शन(function) परिभाषा, इस विशेष फ़ंक्शन(function) प्रोटोटाइप(prototype) को शामिल किया गया है। अब मान लीजिए आपके आवेदन के शरीर में आप कुछ इस तरह लिखना चाहते हैं, आश्चर्य की बात यह है कि इन सभी को स्वीकार किया जाएगा ये सभी मान्य चीजें हैं। इसलिए, आप यहां जो कह रहे हैं, आप कह रहे हैं कि हेडर से तीसरा पैरामीटर(parameter) पहले से ही डिफ़ॉल्ट(default) था, अब आप कह रहे हैं कि मेरा दूसरा पैरामीटर(parameter) भी डिफ़ॉल्ट(default) है। तो अब मेरे पास है; जैसे कि मेरे फ़ंक्शन(function) जी, इसलिए इन दोनों को वास्तव में इसका मतलब है कि मेरे फ़ंक्शन(function) जी में इसके दो पैरामीटर(parameter) डिफ़ॉल्ट(default) हैं और इसी तरह। इसी तरह, तीसरे मामले में यहां हम बताते हैं कि पहले पैरामीटर(parameter) को भी डिफॉल्ट किया गया है। डिफ़ॉल्ट(default) पैरामीटर(parameter) सुविधा आपको ऐसा करने की अनुमति देती है, लेकिन कठिनाई यह है कि जब आप उपयोग कर रहे हैं तो आपको पता नहीं चलेगा कि डिफ़ॉल्ट(default) परिभाषा का कौन सा हिस्सा हेडर फ़ाइल में है और डिफ़ॉल्ट(default) परिभाषाओं का हिस्सा आपकी स्रोत फ़ाइल, कार्यान्वयन फ़ाइल में है। इसलिए, आप किसी भी एक बिंदु पर नहीं जान पाएंगे कि कौन से पैरामीटर(parameter) डिफॉल्ट किए गए हैं और वे किस वैल्यू पर डिफॉल्ट किए गए हैं। तो, सभी चूक जो उपयोग की जानी हैं; यदि आपको ऐसा कुछ करना है, तो उन सभी को हेडर फ़ाइलों में ले जाना चाहिए ताकि एक बिंदु पर आप देख सकें कि क्या डिफ़ॉल्ट(default) पैरामीटर(parameter) मौजूद हैं और उनके मूल्य क्या हैं, अन्यथा डिफ़ॉल्ट(default) पैरामीटर(parameter) वाले कोड लिखने की इस संरचना का यह तंत्र हो सकता है वास्तव में बहुत भ्रमित हो। यह अभ्यास के दृष्टिकोण से एक प्रतिबंध है, भाषा इसे अनुमति देती है यदि आप मेरे अंत को देखें तो मैंने दिखाया है कि इस परिभाषा के साथ आप जो प्राप्त कर सकते हैं वह वास्तव में अब फ़ंक्शन(function) जी को चार अलग-अलग रूपों के साथ कह सकता है क्योंकि सभी तीन पैरामीटर(parameter) अंततः डिफॉल्ट किया गया है, लेकिन एक जगह पर उन्हें डिफॉल्ट करना हमेशा बेहतर होगा, ताकि एक हस्ताक्षर में ही उन्हें तीन फाइलों के बीच विभाजित तीन अलग-अलग हस्ताक्षरों में क्रमिक रूप से डिफॉल्ट करने के बजाय यह उपयोग के उद्देश्य के लिए बहुत भ्रमित हो जाए। तो, हमने C ++ का डिफ़ॉल्ट(default) पैरामीटर(parameter) फीचर देखा है और हमने देखा है कि इसका उपयोग कैसे किया जाता है और इसका उपयोग करने के लिए क्या प्रतिबंध हैं?