본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] 함수 : default parameter, function overloading

by 심찬 2021. 8. 8.

 

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

 

댓글