함수 객체
class CPlus
{
public:
int operator()(int a, int b)
{
return a + b;
}
};
int main()
{
CPlus plus;
cout << plus(30, 40) << endl; // 70
}
()연산자를 오버로딩해서 객체를 함수처럼 사용할 수 있다.
함수 객체는 클래스 선언부 선언되므로 인라인 함수이다. 그러므로 호출에 들어가는 오버헤드를 줄여 속도를 높일 수 있다.
임시 객체
int main()
{
cout << CPlus()(30,40); // 70
}
이렇게 함수 객체를 사용할 수도 있다. 이것을 임시 객체라고 하며 CPlus의 객체를 따로 선언할 필요가 없다.
하지만 임시 객체는 한 줄이 지나면 바로 사라진다.
템플릿
함수나 클래스가 각기 다른 자료형에서도 동작할 수 있게 하는 문법이다.
template<typename T>
T Add(T a, T b)
{
return a + b;
}
int main()
{
cout << Add<int>(3,5); //8
cout << Add<float>(1.12f,2.24f); // 3.36f
}
Add뒤에 <자료형>이 붙는 것은 필수는 아니다. 하지만 명시적으로 표현하기 위해 붙여주는 것이 좋다.
template<>
char* Add(char* a, char* b)
{
int iLength = strlen(a) + strlen(b);
char* pString = new char[iLength + 1];
strcpy_s(pString, iLength + 1, a);
strcat_s(pString, iLength + 1, b);
return pString;
}
템플릿이 특정 자료형에 대해 예외적으로 동작하게 하고 싶을 때 템플릿 특수화를 이용할 수 있다.
위는 함수 템플릿 Add의 자료형이 char*일 때 두 문자열을 결합하도록 템플릿 특수화를 한 것이다.
template<typename T1, typename T2, typename T3>
T3 Add(T1 a, T2 b)
{
return a + b;
}
템플릿에서 사용하는 자료형을 두 개 이상으로 할 수 있다. 보통 한개면 단항, 두개 이상이면 이항 템플릿으로 부른다.
'Today I Learned' 카테고리의 다른 글
| 23.02.23 - cout, 벡터 (0) | 2023.02.24 |
|---|---|
| 23.02.22 - 템플릿2, STL개론 (0) | 2023.02.22 |
| 23.02.20 - 캐스팅 연산자, 인라인 함수, 연산자 오버로딩 (0) | 2023.02.20 |
| 23.02.17 - 순수 가상 함수, 가상 소멸자, 캐스팅 연산자 (0) | 2023.02.17 |
| 23.02.16 - 정적 바인딩과 동적 바인딩, 가상 함수 (0) | 2023.02.16 |