[11-3] ( ) 연산자 오버로딩

dd_ddong·2022년 8월 15일
0

c++

목록 보기
36/38

( ) 연산

  1. 함수호출의 의미
  2. 형 변환의 의미

함수 호출에서 오버로딩

1.객체를 함수처럼 사용할 수 있게 하는 오버로딩
2. 객체의 맴버함수를 함수처럼 호출할 수 있게 하는 오버로딩

1. 객체를 함수처럼

class Adder
{
public:
	int operator() (int num1, int num2)
	{
		return num1 + num2;
	}
};

위와 같이 operator()로 오버로딩한다면

int main ()
{
	Adder adder;
    cout << adder(3, 4); // 7 출력
}

같이 객체를 함수처럼 사용할 수 있다.
함수처럼 호출이 가능ㅎ나 객체를 가리켜 Functor라고 한다.

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;
위의 코드를 분석할때

  1. num.operator=(30);
  • 만약 위와 같은 오버로딩이 없다면
  1. num.operator=(Number(30));
  • 위와 같은 형변환이 일어나 operator=(const Number&)이 호출된다.

형 변환 연산자의 오버로딩

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);

  • 오버로딩이 없기 때문에 pass
  1. num1+20 -> num1.operator+(Number(int));
  • 오버로딩이 없기 때문에 pass
    3.num1+20 -> (int)num1 + 20;
  • operator int ()이 있으므로 int로의 형변환시 호출되는 함수가 있다.
    따라서 위의 형변환이 실행된다.

and Number num2.operator=(int)가 호출됨

0개의 댓글