함수 객체
ex)
class CSum
{
public:
int operator()(int _iA, int _iB)
{
return (_iA + _iB);
}
};
void main()
{
CSum SUM;
int iNum = SUM(10, 20);
cout << iNum << endl;
}
함수 연산자를 오버로딩 하는 방식
객체를 함수처럼 사용한다
-> 이 또한 객체이므로 생성자와 소멸자가 존재한다
이러한 점을 활용하여 외부의 값을 매개변수로 받아서 연산할 수 있다
임시 객체
임시 메모리와 같은 원리로, 코드라인 탈출 시 소멸
따로 객체 선언 없이 객체타입(매개변수); 형태로 선언
해당 라인에서 생성되고 소멸되는 동작이 발생하여 연산 속도가 빠름
메모리를 할당받지 않는다는 점에서 효율이 좋음
Template
ex)
template
T Func(T a, T b)
{
return a + b;
}
Func(10, 20);
Func(3.14f, 2.98f);
함수 / 클래스가 다른 자료형에서 동작하도록 해주는 키워드
함수 매크로처럼 기능은 고정되어 있지만, 자료형에 얽매이지 않음
그 어떤 자료형도 사용이 가능하며, 특정 자료형으로 함수 템플릿을 사용시
해당 자료형을 가진 함수가 인스턴스화 되는 방식으로 동작
inline함수로 사용이 가능하며, 이로 인해 함수 매크로아 inline함수의 단점을 모두 보완
Template의 특수화
ex)
template
T Func(T a, T b)
{
return a + b;
}
template<>
char* Func(char* a, char* b)
{
return (strcat_s(a, b));
}
특정 자료형에 대해 예외적으로 관리 / 작동하도록 지정해주는 문법
해당 문법 사용 시 자료형에 한해 정해진 자료형이 들어가므로 const키워드를 통한 오버로딩 문법을 사용할 수 있다
이항 Template
ex)
template <typename T1, typename T2, ...>
Func<int, float, double>();
여러 가지 형태에 대해 템플릿으로 사용이 가능
클래스 Template
ex)
template
class CObj
{
public:
T Sum(T a, T b)
{
return a + b;
}
}
CObj intObj;
클래스의 형태를 띈 템플릿 -> 절대 클래스가 아님!
클래스는 아니지만. 클래스 템플릿 간에 상속은 발생할 수 있다
클래스 템플릿 사용 시 클래스 내부에서 모든 멤버에 대해 선언과 동시에 초기화 권유
이유?
template
T CObj::Sum(T a, T b)
{
return a + b;
}
외부에서 정의 시
Template 내에서의 Static
ex)
template
void Func(T a)
{
static T Hello;
Hello += a;
cout << Hello << endl;
}
void main()
{
Func(10);
Func(3.14f);
Func(1.23);
Func(5);
Func(5.55f);
Func(4.44);
}
template 내에 선언된 static 변수는 같은 형끼리 공유한다
-> int형 템플릿 함수 생성
-> float형 템플릿 함수 생성
-> double형 템플릿 함수 생성
위 처럼 하나로 동작하는게 아닌, 각 자료형마다 따로 생성되기 때문!
Template의 장단점
장점 : 1. 모든 자료형과 호환됨
2. 컴파일 시점의 문법으로 컴파일러가 에러 체크를 할 수 있다
3. 컴파일러가 직접 사용할 타입에 함수를 생성하므로써 속도가 빠르다
단점 : 1. 자료형마다 함수가 만들어지므로 크기가 커지며 코드의 비대화가 일어난다