디폴트 매개 변수 (default parameter)
디폴트 매개 변수(default parameter)는 기본값이 제공된 함수 매개 변수다. 사용자가 이 매개 변수의 값을 제공하지 않으면 기본값(default value)이 사용된다. 반대로 매개 변수의 값을 제공하면 사용자 제공 값이 기본값 대신 사용된다.
void printValues(int x, int y=10)
{
std::cout << "x: " << x << '\n';
std::cout << "y: " << y << '\n';
}
int main()
{
printValues(1); // y will use default parameter of 10
printValues(3, 4); // y will use user-supplied value 4
}
/*
x: 1
y: 10
x: 3
y: 4
*/
첫 번째 함수 호출(printValues(1)
)에서 호출자는 y에 대한 인수를 제공하지 않으므로 함수는 기본값 10을 사용한다. 두 번째 호출(printValues(3, 4)
)에서 호출자는 y 값을 제공했으므로 사용자 제공 값이 사용되었다.
디폴트 매개 변수(default parameter)가 있는 함수는 사용자가 무시할 수도 있고 그렇지 않을 수도 있으므로 훌륭한 옵션이다. 예를 들어, 다음 예제는 default parameter를 사용하는 몇 가지 함수 원형(prototype)이다.
void openLogFile(std::string filename="default.log");
int rollDie(int sides=6);
void printStringInColor(std::string str, Color color=COLOR_BLACK); // Color is an enum
Multiple default parameters
함수는 디폴트 매개 변수(default parameter)를 여러 개 가질 수 있다.
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
*/
매개 변수 x와 y에 대한 인수를 제공하지 않고는 매개 변수 z에 인수를 제공할 수 없다. C++가 printValues(, , 3)
과 같은 호출 구문을 지원하지 않기 때문이다. 이는 다음과 같은 규칙 때문이다.
모든 default parameter는 오른쪽부터 지정해야 한다. 그래서 다음은 허용되지 않는다.
void printValue(int x=10, int y); // not allowed
Default parameters can only be declared once
선언된 후에는 디폴트 매개 변수(default parameter)를 다시 선언할 수 없다. 즉, 전방 선언과 함수 정의가 있는 함수의 경우, default parameter는 전방 선언이나 함수 정의 둘 중 하나에서만 선언할 수 있다.
void printValues(int x, int y=10);
void printValues(int x, int y=10) // error: redefinition of default parameter
{
std::cout << "x: " << x << '\n';
std::cout << "y: " << y << '\n';
}
가장 좋은 방법은 전방 선언이 다른 헤더 파일에 있는 경우 함수 정의가 아닌 전방 선언에서 default parameter를 선언하는 것이다.
foo.h:
#ifndef FOO_H
#define FOO_H
void printValues(int x, int y=10);
#endif
main.cpp:
#include "foo.h"
#include <iostream>
void printValues(int x, int y)
{
std::cout << "x: " << x << '\n';
std::cout << "y: " << y << '\n';
}
int main()
{
printValues(5);
return 0;
}
위의 예제 main.cpp의 #include "foo.h"는 default parameter를 정의하는 전방 선언을 하고 있기 때문에 printValues()
함수를 가지고 있으므로 main.cpp의 printValues()
함수 정의에서는 default parameter를 사용할 수 없다.
Default parameters and function overloading
디폴트 파라미터(default parameter)가 있는 함수를 오버로딩(overloading)할 수 있다. 예를 들어, 다음 예제를 보자.
void print(std::string string);
void print(char ch=' ');
사용자가 print()
를 호출하면 print(' ')
가 호출되어 스페이스를 출력한다.
그러나 다음은 허용하지 않는다.
void printValues(int x);
void printValues(int x, int y=20);
호출한 사람이 printValues(10)
을 호출하면 컴파일러는 사용자가 printValues(int)
인지 printValues(int, 20)
지 여부를 명확히 할 수 없다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/77-default-parameters/ 입니다.