KoreanFoodie's Study

C++ 기초 개념 4-2 : 함수의 오버로딩, 생성자, 디폴트 생성자 본문

Tutorials/C++ : Beginner

C++ 기초 개념 4-2 : 함수의 오버로딩, 생성자, 디폴트 생성자

GoldGiver 2021. 12. 20. 16:44


함수의 오버로딩 (function overloading)

함수의 오버로딩은, 인자로 들어오는 변수의 타입에 따라 이름이 같은 함수들 중 적합한 함수를 호출해 주는 것을 의미한다.

이때, 인자를 찾는 과정은 다음과 같다.

 

1 단계 :

자신과 타입이 일치하는 함수를 찾는다.

2단계 : 

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

  • Char, unsigned char, short 는 int로 변환된다.
  • Unsinged Short는 int의 크기에 따라 int 혹은 unsigned int로 변환된다.
  • Float는 double로 변환된다.
  • Enum은 int로 변환된다.

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도 될 수 있으므로, 오류가 발생하게 된다.

 

 

생성자와 디폴트 생성자

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

class Date {};

int main() {
    Date Day; // Default Constructor 호출
}

사용자가 다른 생성자를 추가한 순간 컴파일러는 자동으로 디폴트 생성자를 삼입하지 않는다!

 

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

프로그래머는 지금 사용하는 클래스가 컴파일러가 만든 디폴트 생성자를 사용하고 있는지 프로그래머가 만든 생성자를 사용하고 있는지 헷갈릴 수 있다. C++11 부터는, 컴파일러에게 명시적으로 디폴트 생성자를 생성하도록 표기할 수 있다!

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

 

Comments