C ++ में एक विधि के लिए वैकल्पिक तर्क कैसे पारित करें?


112

C ++ में एक विधि के लिए वैकल्पिक तर्क कैसे पारित करें? कोई भी कोड स्निपेट ...


9
आप विकल्प पैरामीटर पास नहीं करते हैं। आप वैकल्पिक तर्क पारित करें!
चब्सडैड

प्रहरी मूल्यों को संग्रहीत करके प्रदान किए गए से अधिक स्पष्ट नियंत्रण के लिए, बढ़ावा देखें :: वैकल्पिक <>।
टोनी डेलरो

जवाबों:


145

यहां वैकल्पिक पैरामीटर के रूप में पासिंग मोड का एक उदाहरण है

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

आप दोनों तरीकों से myfunc को कॉल कर सकते हैं और दोनों वैध हैं

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

क्या आप स्ट्रिंग से संबंधित कुछ उदाहरण प्रदान कर सकते हैं?
स्वप्निल गुप्ता

void myfunc (int blah, char mode [] = NULL)
प्रमेंद्र गुप्ता

2
NULLका अर्थ है एक पूर्ण सूचक, भले ही इसे शाब्दिक के रूप में परिभाषित किया गया हो 0। यह निरंतर शून्य के लिए एक सार्वभौमिक नाम नहीं है। पूर्णांक (नॉन-पॉइंटर्स) के लिए आपको संख्याओं का उपयोग करना चाहिए int mode = 0:।
चाचा

1
यदि आप एक वर्ग (स्रोत और हेडर फ़ाइलें) के साथ काम कर रहे हैं, तो आप डिफ़ॉल्ट मान को कहाँ परिभाषित करेंगे?
ऐसफंक

2
@AceFunk सुपर देर से, लेकिन मैंने जो कोड देखा है, उसमें हेडर में परिभाषित डिफ़ॉल्ट मान है। यदि आप इसके बारे में सोचते हैं, तो सिस्टम को यह नहीं पता होगा कि यदि आप स्रोत में वैकल्पिक को परिभाषित किया गया है, तो आप मूल्य को छोड़ सकते हैं
मंगल

50

डिफ़ॉल्ट पैरामीटर उपयोग के संबंध में एक महत्वपूर्ण नियम:
डिफ़ॉल्ट पैरामीटर को सबसे अंत में निर्दिष्ट किया जाना चाहिए, एक बार जब आप डिफ़ॉल्ट मान पैरामीटर निर्दिष्ट करते हैं तो आप फिर से गैर डिफ़ॉल्ट पैरामीटर निर्दिष्ट नहीं कर सकते। उदाहरण के लिए:

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 

@Chubsdad - आह्ह..मैं बुरा अस्पष्ट बयान! क्या दूसरा कथन सही है? "एक बार जब आप एक डिफ़ॉल्ट मान पैरामीटर निर्दिष्ट करते हैं, तो आप फिर से डिफ़ॉल्ट डिफॉल्ट नहीं कर सकते हैं"
आलोक सेव

1
इसलिए अगर मुझे सही तरीके से समझ में आता है कि मेरे पास कई वैकल्पिक पैरामीटर हैं या तो मुझे उन सभी को लागू करना चाहिए या कोई भी नहीं? मैं 1 वैकल्पिक पैरामीटर का उपयोग करने का विकल्प नहीं चुन सकता लेकिन बाकी नहीं?
गेरार्ड

@Gardard: "अनुमत" उदाहरण एक वैकल्पिक पैरामीटर दिखाता है न कि शेष उपयोग का मामला जो वैध है।
आलोक सेव

4
मैं समझता हूं, लेकिन क्या होगा यदि मैं int foo(int x, int y = 10, int z = 10)फोन करना चाहता हूं और foo(1,2)केवल एक वैकल्पिक पैरामीटर देना चाहता हूं । मुझे ऐसा नहीं लगता था कि मैं खुद काम कर पाऊं।
गेरार्ड

30

यह आप में से कुछ के लिए दिलचस्प हो सकता है कि कई डिफ़ॉल्ट मापदंडों के मामले में:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

निम्नलिखित फ़ंक्शन कॉल को देखते हुए:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

निम्नलिखित आउटपुट का उत्पादन किया जाता है:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

संदर्भ: http://www.learncpp.com/cpp-tutorial/77-default-parameters/


1
यह वही है जिसे मैं देख रहा था। एक फ़ंक्शन का उपयोग करें जो विभिन्न प्रकार के तर्कों को संभाल सकता है। हेडर फ़ाइल में डिफ़ॉल्ट मान के साथ फ़ंक्शन को घोषित करें फिर इसे डिफ़ॉल्ट पैरामीटर के बिना परिभाषित करें और फिर आप इसका उपयोग कर सकते हैं। फ़ंक्शन ओवरलोड करने की कोई आवश्यकता नहीं है
तेह सुन्न लियू

15

डिफ़ॉल्ट मापदंडों का उपयोग करें

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

नोट: निम्नलिखित बीमार हैं

template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )

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

13

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

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

10

अल्पविरामों को अलग करने के साथ, डिफ़ॉल्ट मानों के बिना मापदंडों की तरह।

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2

9

आमतौर पर एक पैरामीटर के लिए डिफ़ॉल्ट मान सेट करके:

int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}

8

Std :: C ++ 17 में वैकल्पिक के साथ आप वैकल्पिक तर्क पारित कर सकते हैं:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

आउटपुट:

id=first param=<parameter not set>
id=second param=something

Https://en.cppreference.com/w/cpp/utility/optional देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.