컴공생의 다이어리
[c++] 함수의 오버로딩 본문
C++에는 C에서 쓸 수 없는 함수의 오버로딩이 가능하다. c언어에서는 하나의 이름을 가지는 함수는 딱 1개만 존재할 수 있다. 하지만 c++에서는 같은 이름을 가진 함수가 여러개 존재할 수 있다.
아래과 같이 같은 이름의 함수를 호출했을 때 함수를 어떻게 해서 구분을 할까? 그 방법은 바로 함수를 호출 하였을 때 사용하는 인자를 보고 결정하는 것이다.
#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.2f;
print(a);
print(b);
print(c);
return 0;
}
더보기
int : 1
char : c
double : 3.2
만일 아래와 같이 print 함수가 int와 double 타입의 인자를 받는 함수 밖에 없다면 char형 데이터인 b의 경우 print(b)를 호출하면 b는 자기 자신과 정확히 일치하는 타입의 인자를 가진 함수가 없기 때문에 자신과 최대로 근접한 함수를 찾게 된다.
#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;
}
더보기
int : 1
int : 99
double : 3.2
c++ 컴파일러에서 함수를 오버로딩하는 과정은 아래와 같다.
1단계 | 자신과 타입이 정확히 일치하는 함수를 찾는다. |
2단계 | 정확히 일치하는 타입이 없는 경우 아래와 같은 형 변환을 통해서 일치하는 함수를 찾아본다. - char, unsigned char, short는 int로 변환된다. - unsigned short는 int의 크기에 따라 int 혹은 unsigned int로 변환된다. - float 혹은 double로 변환된다. - enum은 int로 변환된다. |
3단계 | 위와 같이 변환해도 일치하는 것이 없다면 아래의 좀 더 포괄적인 형 변환을 통해 일치하는 함수를 찾는다. - 임의의 숫자(numeric) 타입은 다른 숫자 타입으로 변환된다. - enum도 입의의 숫자 타입으로 변환된다. - 0은 포인터 타입이나 숫자 타입으로 변환된 0은 포인터 타입이나 숫자 타입으로 변환된다. - 포인터 void 포인터로 변환된다. |
4단계 | 유저 정의된 타입 변환으로 일치하는 것을 찾는다 |
728x90
'Development > C & C++' 카테고리의 다른 글
[c++] 레퍼런스를 리턴하는 함수 (0) | 2020.12.27 |
---|---|
[c++] 클래스의 객체 수 (0) | 2020.12.27 |
[c++] 객체, 클래스 (0) | 2020.12.18 |
[c++] 메모리 할당과 해제 (0) | 2020.12.18 |
[c++] 배열의 레퍼런스 (0) | 2020.12.17 |
Comments