인자로 들어오는 변수의 타입에 따라 이름이 같은 함수들 중 적합한 함수를 호출해 주는 기능
#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. 정확히 일치하는 타입이 없는 경우 아래와 같은 형변환을 통해 일치하는 함수를 찾음
char
, unsigned char
, short
는 int
로 변환unsigned short
는 int
의 크기에 따라 int
혹은 unsigned int
로 변환float
은 double
로 변환enum
은 int
로 변환3. 위와 같이 변환해도 일치하는 것이 없다면 아래의 좀 더 포괄적인 형변활을 통해 일치하는 함수를 찾음
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;
}
생성자(Constructor)는 클래스를 인스턴스할 때 초기화 과정에서 호출되는 함수이다. 하지만 생성자 정의를 하지 않는다면, 디폴트 생성자(Default Constructor)가 호출된다.
사용자가 다른 생성자를 추가한다면 컴파일러는 자동으로 디폴트 생성자를 삽입하지 않는다.
C++11 부터 가능
class Test {
public:
Test() = default; // 디폴트 생성자를 정의해라
}