[이것이 C++이다] Part 01. C에서 C++로 문법 전환하기 (3)
Chapter 02. C++ 함수와 네임스페이스
2.1 디폴트 매개변수
-
C언어 에서는 꼭 함수의 매개변수에 실인수를 기술해야 한다. 하지만 C++에서는 꼭 그렇지 않아도 된다.
int testfunc(int nparam = 10) { return nparam; } int main() { std::cout << testfunc(); << std::endl; std::cout << testfunc(20) << std::endl; return 0; } // 10 // 20
-
매개변수의 디폴트 값은 반드시 함수의 원형 에 기술해야 한다.
int testfunc(int = 10); // C++에서는 함수 원형 선언에서 매개변수 이름을 생략할 수 있다. int testfunc(int nparam) { return nparam; } int main() { std::cout << testfunc() << std::endl; return 0; } // 10
-
디폴트 값을 오른쪽 매개변수 부터 순서 대로 기술해야 한다.
int testfunc(int nparam=5, int nparam2); // 오른쪽부터 기술해야 함 int testfunc2(int nparam=5, int nparma2, int nparam3=10); // 중간의 매개변수 디폴트값 생략 불가
2.2 함수의 다중정의 (Overloading)
- C++ 에서는 함수의 다형성을 지원하며, 그 중에 하나가 Overloading 이다.
- 함수의 원형이 달라지면(매개변수) 이름이 같더라도 다른 함수가 된다.
-
다형성 : 하나의 개념을 여러 가지 형태로 구현할 수 있다.
int Add(int, int, int); int Add(int, int); double Add(double, double); // 더하기 라는 하나의 개념을 세 가지로 선언하였다.
2.2.1 다중 정의(Overloading)의 모호성
-
다중 정의에 디폴트 매개변수가 결합되면 강력한 모호성 이 발생한다.
int Add(int, int=10); int Add(int); // Add(5) 로 함수를 호출한다면 둘 중 어떤 함수가 Call될까?
- 함수 호출자는 오류를 경험할 수 있다.
2.2.2 함수 템플릿
- 자동으로 다중 정의가 이루어진다.
-
같은 일을 하는 코드가 여러 번 등장할 필요가 없기 때문에 유지보수 측면에서 좋은 구조이다.
template <typename T> T testfunc(T a) { std::cout << a << std::endl; return a; }