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.