C++에서는 함수의 오버로딩기능을 제공한다.

/* 함수의 오버로딩 */
#include <iostream>

void print(int x) { std::cout << "int : " << x << std::endl; }
void print(double x) { std::cout << "double : " << x << std::endl; }

int main() {
  int a = 1;
  char b = 'c';
  double c = 3.2f;

  print(a);
  print(b);
  print(c);

  return 0;
}

<aside> 💡 출력 int : 1 int : 99 double : 3.2

</aside>

위 '함수의 오버로딩' 예제에서는 int와 double 타입의 인자를 받는 함수를 만들고 int, char, double타입의 인자들로 print함수를 호출하였다. char의 경우 자기와 정확히 일치하는 인자를 가지는 함수가 없기 때문에 '자신과 최대한 근접한 함수'를 찾게 된다. C++에서 함수를 오버로딩하는 과정은 다음과 같다.

  1. 자신과 타입이 정확히 일치하는 함수를 찾는다.
  2. 정확히 일치하는 타입이 없는 경우 아래와 같은 형변환을 통해 함수를 찾는다.
  1. 위와 같이 변환해도 일치하는 것이 없다면 좀더 포괄적인 형변환을 통해 함수를 찾는다.
  1. 유저 정의된 타입 변환으로 일치하는 것을 찾는다.

만약 컴파일러가 위 과정을 통해서 일치하는 함수를 찾을 수 없거나, 같은 단계에서 두 개 이상이 일치하는 경우 모호하다(ambiguous)라고 판단해서 오류를 발생한다. 이러한 제약으로 위와 같은 C++ 오버로딩 규칙을 머리속에 숙지하는 일은 중요하다. 나중에 복잡한 함수를 오버로딩할 때 여러개가 중복되서 나온다면 슬프다.

생성자

객체 생성시 자동으로 호출되는 함수. 객체를 초기화 해주는 역할. 디폴트 생성자를 이용해서 암시적 방법으로 객체를 생성할때 주의해야한다.

Date day = Date(); // 디폴트 생성자로 day 초기화 - 명시적 방법
Date day2; // 디폴트 생성자로 day2 초기화 - 암시적 방법
Date day3(2011, 3, 1);  // (int,int,int) 생성자로 dat3 초기화 - 암시적 방법 (implicit)
Date day3();  // 리턴값이 Date이고 인자가 없는 함수 day4을 정의

C++ 11부터는 명시적으로 디폴트 생성자를 사용하도록 명시할 수 있다.