default parameter
함수가 만들어지는 시점에 입력받는 값이 없을 경우에는 default 값이 set되게 할 수 있다. default paramater라고 말한다.
c++에서는 function 정의할 때 default parameter를 지정할 수 있다.
시, 분, 초 에서 '시' 값만 입력하면 나머지 분, 초는 0로 값이 설정되게 하는 예시다.
void setAlarm(int h, int m = 0, int s = 0)
{
// ......
}
int main()
{
setAlarm( 3, 4, 5);
setAlarm( 3, 0, 0);
setAlarm( 3); // 3, 0, 0
setAlarm( 3, 30); // 3, 30, 0
}
default parameter 사용시 주의사항 2가지
1. 함수의 마지막 인자부터 차례대로 디폴트 값을 지정해야 한다.
void foo(int a = 0, int b) { } // error
int main()
{
foo(10);
}
void f1(int a, int b, int c = 0) {} // ok
void f2(int a, int b = 0, int c = 0) {} // ok
void f3(int a = 0, int b = 0, int c = 0) {} // ok
void f4(int a, int b = 0, int c ) {} // error
void f5(int a = 0, int b, int c = 0) {} // error
void f6(int a = 0, int b, int c ) {} // error
defulat argument가 미씽되었다는 error를 확인해 볼 수 있다.
main.cpp:1:6: error: default argument missing for parameter 2 of ‘void foo(int, int)’
2. 함수를 선언과 구현으로 분리할 때, 함수 선언부만 디폴트 값을 표기해야 한다.
- 선언과 구현에 모두 디폴트 값 표기시 컴파일에서 에러 발생한다.
- 선언에 표기하지 않고 구현에만 표기하면 함수 호출시 디폴트 값을 사용할 수 없다.
// 함수 선언부
void foo(int a = 0, int b = 0);
int main()
{
foo(1, 2); // ok
foo(1);
foo();
}
// 함수 구현부
void foo(int a /* = 0 */, int b /* = 0 */ )
{
}
function overloading
c++에서는 동일한 이름의 함수를 2개 이상 만들 수 있다. (c언어에서는 불가)
단, 함수 호출시 구분이 가능하도록 인자의 개수나 인자의 타입이 달라야 한다.
int square(int a)
{
return a * a;
}
double square(double a)
{
return a * a;
}
int main()
{
sqaure(3);
sqaure(3.3);
}
f1 의 경우 인자가 int와 double로 구분이 되므로 사용이 가능하다.
f2 의 경우 인자의 개수로 구분이 되므로 사용이 가능하다.
f3 의 경우 두 함수를 구분할 수가 없어서 사용이 불가하다.
f4 의 경우 반환값만 다르기에 함수 구분이 불가해 사용이 불가하다.
f5 의 경우 인자가 다르다 할지라도 형태 구분이 어려운 경우도 있으니 참조!
void f1(int a) {}
void f1(double d) {} // ok
void f2(int a) {}
void f2(int a, int b) {} // ok
// 두번째 것이 default parameter 값이 있어서 불가함.
void f3(int a) {}
void f3(int a, int b = 0) {} // error
// 반환값이 다르다고 해서 오버로딩 불가함.
// input 인자 값이 구분이 가능해야 한다.
int f4(int a) { return 0;}
double f4(int a) { return 0;} // error
void f5(int n) {}
void f5(char* s) {}
int main (){
f1(3.4);
f2(1);
f2(1,1);
f3(10);
f4(10);
f5(0); // f5(int); // 가독성이 떨어져 좋은 코딩이 아님.
f5((char*)0); // 예전에는 이런 식으로 사용 가능했음.
f5(nullptr); // f5(char*) // C++11 둘 중 아래 것을 호출함.
}
f3와 f4에 대해서 아래와 같이 error가 발생됨을 확인할 수 있다.
main.cpp:14:8: error: ambiguating new declaration of ‘double f4(int)’
main.cpp:26:10: error: call of overloaded ‘f3(int)’ is ambiguous
'C++' 카테고리의 다른 글
[C++] 함수 삭제 (function delete) (0) | 2021.08.09 |
---|---|
[C++] 함수 : template, inline (0) | 2021.08.09 |
[C++] string : 비교, 대입, c_str() (0) | 2021.08.07 |
[C++] 변수 선언 : constexpr, structure binding (0) | 2021.08.07 |
[C++] 변수 선언 : uniform initialize, auto, decltype, using (0) | 2021.08.06 |
댓글