- 함수호출의 의미
- 형 변환의 의미
1.객체를 함수처럼 사용할 수 있게 하는 오버로딩
2. 객체의 맴버함수를 함수처럼 호출할 수 있게 하는 오버로딩
class Adder
{
public:
int operator() (int num1, int num2)
{
return num1 + num2;
}
};
위와 같이 operator()로 오버로딩한다면
int main ()
{
Adder adder;
cout << adder(3, 4); // 7 출력
}
같이 객체를 함수처럼 사용할 수 있다.
함수처럼 호출이 가능ㅎ나 객체를 가리켜 Functor라고 한다.
functor는 함수 포인터의 역할을 수행할 수 있다.
class SortRule
{
public:
virtual bool operator() (int num1, int num2) const = 0;
};
class AscendingSort : public SortRule
{
public:
bool operator () (int num1, int num2) const
{
if (num1 > num2)
return true;
else
return false;
}
};
class DescendingSort : public SortRule
{
public:
bool operator()(int num1, int num2) const
{
if (num1 < num2)
return true;
else
return false;
}
};
;
class DataStorage
{
private:
int* arr;
int idx;
public:
DataStorage() :idx(0)
{
arr = new int[10];
}
void SortData(const SortRule& functor)
{
for (int i = 0; i < (idx - 1); i++)
{
for (int j = 0; j < (idx - 1) - i; j++)
{
if (functor(arr[i], arr[j + 1]))
{
int temp = arr[j];
arr[i] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
};
SortData 함수에서 매개변수로 SortRule객체를 받고 객체의 종류에 따라 오름차순인지 내림차순인지 정할수 있다.
사용은 다음과 같이 하면 된다.
int main()
{
DataStorage storage;
storage.SortData( AscendingSort());
}
int main()
{
Numder num;
num = 30;
}
num = 30;
위의 코드를 분석할때
class Number
{
private:
int num;
public:
Number(int n=0) : num(n)
{
}
Number& operator=(const Number& ref)
{
num = ref.num;
return *this;
}
operator int () // 형 변환 연산자의 오버로딩
{
return num; //해당 객체가 int형으로 변환되어야 하는 상황에서 호출되는 함수
}
}
int main()
{
Number num1;
Number num2 = num1+20;
}
Number num2 = num1+20;
을 해석해보자
1. num1+20
-> num1.operator+(int);
num1+20
-> num1.operator+(Number(int));
num1+20
-> (int)num1 + 20;
and Number num2.operator=(int)
가 호출됨