[Modern C++] 4.2. 함수의 오버로딩, 생성자

윤정민·2023년 6월 30일
0

C++

목록 보기
10/46

1. 함수의 오버로딩(function overloading)

인자로 들어오는 변수의 타입에 따라 이름이 같은 함수들 중 적합한 함수를 호출해 주는 기능

1.1. 예제

#include <iostream>

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

int main()
{
  int a = 1;
  char b = 'c';
  double c = 3.141592f;
  
  print(a);
  print(b);
  print(c);
  
  return 0;
}
  • 실행결과
    int : 1
    char : c
    double : 3.141592

1.2. C++ 컴파일러의 함수 오버로딩 과정

1. 자신의 타입과 정확히 일치하는 함수를 찾음

2. 정확히 일치하는 타입이 없는 경우 아래와 같은 형변환을 통해 일치하는 함수를 찾음

  • char, unsigned char, shortint로 변환
  • unsigned shortint의 크기에 따라 int혹은 unsigned int로 변환
  • floatdouble로 변환
  • enumint로 변환

3. 위와 같이 변환해도 일치하는 것이 없다면 아래의 좀 더 포괄적인 형변활을 통해 일치하는 함수를 찾음

  • 임의의 숫자(numeric) 타입은 다른 숫자 타입으로 변환 (e.g. float -> int)
  • Enum도 임의의 숫자 타입으로 변환 (e.g. Enum -> double)
  • 0은 포인터 타입이나 숫자 타입으로 변환된 0은 포인터 타입이나 숫자 타입으로 변환
  • 포인터는 void 포인터로 변환

4. 유저 정의된 타입 변환으로 일치하는 것을 찾는다.


만약 컴파일러가 위 과정을 통하더라도 일치하는 함수를 찾을 수 없거나 같은 단계에서 두 개 이상이 일치하는 경우에 모호하다(ambiguous) 라고 판단해서 오류가 발생하게 된다.

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

int main() {
    double c = 4.2f;
    print(c);
    
    return 0;
}
  • print(c)는 3단계에서 double이 int도, char도 될 수 있으므로, 오류 발생

2. 생성자와 디폴트 생성자

생성자(Constructor)는 클래스를 인스턴스할 때 초기화 과정에서 호출되는 함수이다. 하지만 생성자 정의를 하지 않는다면, 디폴트 생성자(Default Constructor)가 호출된다.

사용자가 다른 생성자를 추가한다면 컴파일러는 자동으로 디폴트 생성자를 삽입하지 않는다.

2.1. 명시적으로 디폴트 생성자 사용하기

C++11 부터 가능

class Test {
public:
    Test() = default; // 디폴트 생성자를 정의해라
}
profile
그냥 하자

0개의 댓글