본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 12. C++ 함수 오버로딩 function overloading 사용법, 주의사항

by 신림83 2020. 10. 22.
반응형

CPP 초급 강좌 12. C++ 함수 오버로딩 function overloading 사용법, 주의사항

함수 오버로딩(function overloading)

동일한 이름을 함수를 여러개 만들 수 있는 기능

단, 인자의 개수, 인자의 타입이 달라야 한다.

 

사용자 입장에서는 동일 함수처럼 사용할수 있어 좋다.

 

이게 당연한 거지라고 생각하실지도 모르겠지만, C언어는 안 되는 기능이다.

 

예제 코드

void f1(int p1) {};
void f1(int p1, int p2) {};
void f1(int p1, int p2, int p3) {};

void f1(float p1) {};

int main()
{
	f1(0);
	f1(0,0);
	f1(0,0,0);
	f1(0.0f);
}

 

주의사항

디폴트 파라미터와 같이 사용할 수 없는 경우가 있다. 

void f1(int p1) {};
void f1(int p1, int p2 = 0) {};

int main()
{
	f1(0);
}

안됨, 컴파일러는 뭘 호출하려는지 의도를 알수 없다. 나도 모르겠다.

 

반환 타입만 다르다.

void f1(int p1) {};
int f1(int p1) {};

int main()
{
	f1(0);
}

반환타입만 달라서는 함수 호출 입장에서 구분할 수 없다. 안된다.

안된다.

반환타입이 달라고 인자수의 차이로 구분이 가능하면 문제없다. 아래 코드 보세요.

void f1(int p1) {};
int f1(int p1, int p2) {};

int main()
{
	f1(0);
}

 위 코드는 잘 된다. 반환 타입이 다르지만, 인자 수가 차이가 있어 구별이 가능하다.

 

정수 타입, 포인터 타입 인자의 함수 오버로딩?

#include <iostream>
using namespace std;

void f1(int p1) { cout << "int" << endl; };
void f1(char* s) { cout << "char*" << endl; };

int main()
{
	f1(0);
	f1(NULL);
	f1(nullptr);
}

정수타입과 포인터 타입의 인자로 사용하는 함수 오버로딩은 모호하다. char* 부르기 위해서는 이전에는 char* 로 명시적인 형 변환이 필요했다. c++11 부터 nullptr이란게 생겨서 구지 부르면 부를수 있다.

결과

하지만 이런 오버로딩은 쓰기가 어렵다. 추천하지 못하겠다.

 

 

배우자!!

봐주셔서 감사합니다.

반응형

댓글