함수 호출 연산자 오버로딩
Print(10)이라는 함수 호출 문장은 다음 세 가지로 해석할 수 있다.
1. 함수 호출 : Print가 함수 이름
2. 함수 포인터 : Print가 함수 포인터
3. 함수 객체 : Print가 함수 객체
#include <iostream>
using namespace std;
struct FuncObject {
public:
void operator()(int arg) const
{
cout << "정수 : " << arg << endl;
}
void operator()(int arg1, int arg2) const
{
cout << "정수 : " << arg << endl;
}
};
void Print1(int arg)
{
cout << "정수 : " << arg << endl;
}
int main()
{
//exam 1
void(*Print2)(int) = Print1;
FuncObject Print3;
Print1(10); 함수 호출
Print2(10); 함수 포인터
Print3(10); 함수 객체
//exam 2
FuncObject print;
print(10,20); //객체 생성 후 호출 (암시적)
print.operator()(10,20); //객체 생성 후 호출 (명시적)
FuncObject()(10,20); //임시 객체로 호출(암시적)
FuncObject.operator()(10,20); //임시 객체로 호출(암시적)
return 0;
}
exam 1
Print1은 함수를 사용한 정수 출력
Print2은 함수 포인터를 사용한 정수 출력
Print3은 함수 객체를 사용한 정수 출력
exam 2
암시적 호출은 사실 명시적 호출과 같이 동작하지만 .operator()가 생략되었다고 보면된다. 그리고 임시 객체는 그 문장에서 생성되고 그 문장을 벗어나면 소멸된다.