C ++의 메서드에 선택적 인수를 전달하는 방법은 무엇입니까?


112

C ++의 메서드에 선택적 인수를 전달하는 방법은 무엇입니까? 모든 코드 스 니펫 ...


9
옵션 매개 변수를 전달하지 않습니다. 선택적 인수를 전달합니다!
Chubsdad

센티넬 값을 예약하여 제공하는 것보다 더 명시 적으로 제어하려면 boost :: optional <>을 확인하세요.
Tony Delroy

답변:


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

pls는 문자열과 관련된 몇 가지 예를 제공 할 수 있습니까?
Swapnil Gupta

공극이 myfunc (INT ㅋ, 문자 모드 [] = NULL)
Pramendra 굽타

2
NULL리터럴로 정의 되더라도 NULL 포인터를 의미합니다 0. 상수 0에 대한 보편적 인 이름이 아닙니다. 정수 (포인터가 아님)의 경우 숫자를 사용해야합니다 : int mode = 0.
UncleBens

1
클래스 (소스 및 헤더 파일)로 작업하는 경우 기본값을 어디에 정의 하시겠습니까?
AceFunk

2
@AceFunk Super 늦었지만 내가 본 코드에는 헤더에 정의 된 기본값이 있습니다. 생각해 보면 옵 셔널이 소스에 정의 된 경우 값을 생략 할 수 있다는 것을 시스템이 알지 못합니다
Mars

50

기본 매개 변수 사용에 관한 중요한 규칙 :
기본 매개 변수는 가장 오른쪽 끝에 지정해야 합니다. 기본값 매개 변수를 지정하면 기본 매개 변수가 아닌 매개 변수를 다시 지정할 수 없습니다. 전의:

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

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

@Chubsdad-Ahh .. 내 나쁜 애매한 진술! 두 번째 진술은 그것을 올바르게 요약합니까? "기본값 매개 변수를 지정하면 기본값이 아닌 매개 변수를 다시 지정할 수 없습니다."
Alok Save

1
따라서 여러 선택적 매개 변수가 있는지 올바르게 이해하면 모두 구현하거나 전혀 구현하지 않아야합니까? 하나의 선택적 매개 변수를 사용하도록 선택할 수 없지만 나머지는 사용할 수 없습니까?
Gerard

@Gerard : "Allowed"예제는 유효한 나머지 사용 사례가 아닌 하나의 선택적 매개 변수를 보여줍니다.
Alok Save

4
이해합니다.하지만 내가 가지고 int foo(int x, int y = 10, int z = 10)있고를 호출하고 싶다면 foo(1,2)하나의 선택적 매개 변수 만 제공합니다. 나는 그것을 스스로 작동시킬 수없는 것 같았다.
Gerard

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
이것이 제가 찾던 것입니다. 다른 수의 인수를 처리 할 수있는 하나의 함수를 사용하십시오. 헤더 파일에 기본값으로 함수를 선언하고 기본 매개 변수없이 정의하면 사용할 수 있습니다. 기능을 만드는 필요가 과부하되지
하기 Teh Sunn 리우에게

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 )

일반적인 솔루션 덕분에 임의의 유형에 대해 기본값을 제공하는 방법을 알아 내려고했습니다.
Anonymous

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

C ++ 17에 std :: optional이 도입됨에 따라 선택적 인수를 전달할 수 있습니다.

#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을 참조 하세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.