[이것이 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;
    }