함수 오버로딩
-> 함수를 재정의하는 문법.
-> 재정의 시 인자의 정보를 다르게 작성한다.
(함수의 이름을 동일하게 만들지만 인자 정보를 다르게 작성하는 방법)
-> 함수를 호출할 때 인자 정보에 따라 호출할 함수를 탐색하여 호출한다.
-> 단, 반환 타입에 따른 오버로딩은 존재하지 않는다.
함수의 오버로딩을 사용하지 않을 경우
int Add(int _a, int _b)
{
return _a + _b;
}
float Add_float(float _a, float _b)
{
return _a + _b;
}
double Add_double(double _a, double _b)
{
return _a + _b;
}
void main()
{
cout << Add(10, 20) << endl;
cout << Add_float(3.9f, 3.9f) << endl;
cout << Add_double(3.9, 3.9) << endl;
}
함수의 오버로딩을 사용한 경우
int Add(int _a, int _b)
{
cout << "int Add" << endl;
return _a + _b;
}
float Add(float _a, float _b)
{
cout << "float Add" << endl;
return _a + _b;
}
double Add(double _a, double _b)
{
cout << "double Add" << endl;
return _a + _b;
}
void main()
{
cout << Add(10, 20) << endl;
cout << Add(3.9f, 3.9f) << endl;
cout << Add(3.9, 3.9) << endl;
}
하지만 이런 방식은 대부분 틀린 방식이라고 한다.
올바른 방식의 함수 오버로딩은 다음과 같다.
const File* GetFileIndex(const int index) const;
const File* GetFileName(const char* name) const;
const 반환을 위한 함수 오버로딩은 다음과 같다.
File* GetFileIndex(const int index);
const File* GetFileIndex(const int index) const;
const_cast의 직접적으로 사용하지 않는다.
대신 const인 개체를 수정 가능한 형태로 변환해서 반환하는 함수를 만든다.
main함수에서 Add의 값을 호출할 때 a, b, c, d의 값에서 a, b의 값만 호출하고 싶을 때,
다음과 같이 여러번 호출하게 되는 경우가 있다.
cout << Add(10, 20) << endl;
cout << Add(10, 20, 30) << endl;
cout << Add(10, 20, 30, 40) << endl;
이를 해결하기 위해 디폴트 매개 변수라는 것을 사용해보자.
디폴트 매개 변수
-> 매개변수의 값을 기본적으로 설정해 놓는 것.
int Add(int _a, int _b, int _c = 0, int _d = 0)
-> 함수 호출 시 넘겨주는 인자가 부족할 경우 기본적으로 설정한 값이 매칭된다.
다음과 같이 Add를 호출 할 경우 a + b + c + d = 30이 나오게 된다.
cout << Add(10, 20) << endl;
하지만, c의 자리에 30이란 정수 값을 넣어주게되면 0이 아닌 30이 들어가게되서
a + b + c + d = 60이 나오게 된다.
cout << Add(10, 20, 30) << endl;
-> 즉, 인자가 부족하지 않을 경우 넘겨주는 값으로 매칭된다.
디폴트 매개 변수 사용 시 주의사항
-> 우측 끝에서부터 순차적으로 채워나가야 한다.
가능
int Add(int _a, int _b, int _c = 0, int _d = 0)
불가능
int Add(int _a, int _b = 0, int _c, int _d = 0)
-> 선언부에서만 명시하고, 정의부에서는 명시할 수 없다.
가능
// 선언부
int Add(int _a, int _b, int _c = 0, int _d = 0)
불가능
// 정의부
int Add(int _a, int _b, int _c = 0, int _d = 0)
{
return _a + _b + _c + _d;
}
디폴트 매개 변수 대신 함수 오버로딩을 선호한다.
디폴트 매개 변수를 사용하는 경우, nullptr 나 false, 0 같이 비트 패턴이 0인 값을 사용한다.
'Programming > C++ Basic' 카테고리의 다른 글
C++ 포인터 (0) | 2020.08.26 |
---|---|
C++ 재귀 함수 (0) | 2020.08.25 |
C++ 함수의 선언부, 정의부 (0) | 2020.08.25 |
C++ 지역 변수, 전역 변수, 정적 변수(static) (0) | 2020.08.24 |
C++ 함수란? (0) | 2020.08.24 |