전위연산자의 경우 반환타입이 iterator& (iterator를 참조하는것을 반환)
하는 이유가 뭐때문이냐?
=> ++(++k) 하는 경우를 대비하기 위하여.
이런경우 발생할 수 있기 때문에.
우리는 iterator& 자체를 반환하면되는데
operator++ 를 오버로딩 한 것이기 때문에
indexNumber 를 하나 늘린 것을 참조하여 반환하면되기 때문에
++m_iIdx;를 해주고
예외처리를 1., 2., 3. 으로 해준다.
idx가 -1일 경우 end iterator로 보기로했다.
이상태에서 실행하면된다.
나는 this, 나랑 비교할(호출된 애는 인자로) 녀석 other
현재 이 "=="라는 멤버함수를 호출 시킨 객체는 "this"
나랑 비교될 애는 otherIter이다.
추가한 데이터를 관리하는게 "가변배열"
가변배열에 안에 들어있는 요소들을 가르킬 수 있는 것이 "iterator"
이 경우에 두개의 iterator가 같다고 볼 수 있다.
이거 멤버 변수 세가지 중에 뭐가 같으면 될까?
세가지 다 같아도되고, m_pData, m_iIdx같으면될듯.
가변배열 두개를 만들어서 각각의 iterator를 만들어서 인덱스 5번을 각각 가르킨다고 가정하자.
그러면 두개의 iterotor는 같나? => 당연히 다른 iterator이다.
(그래서 m_i_indexNumber 만으로만은 판별 못함)
같은 경우에 true 내뱉는다.
다르나요? => 같다면 false이니까
return !(*this == otherIter);
먼상황???
그래서 operator != 를 호출 시켰더니
안에서 "==" => "operator =="를 다시 호출 시킨것임.
그래서
*this 와 otherIter를 operator == 로 비교를해서 나오는 bool값에
'!'로 반전 시킨 것임.
만약에 *this == otherIter한 값이 true이다. 라면
그것을 반전시키면 false가 되는데 반전을 시키는 이유는
!= 같지 않음을 나타내는 오버로딩(operator !=)이기 때문에.
전위와 후위는 operator함수 자체가 다르다!
호출되는 시점은 똑같기 때문에 나중에 호출 시키거나 할 수 없다.
그래서 아예 다른 함수를 만들어서 호출 시켜주어야한다.
(어떻게?)
이렇게 자기 자신을 반환 해주도록 하면
절대 후위 연산자 처럼 동작할 수 없다.
그래서
ref로 반환을 안하고 복사본을 준다.
그리고 인자로
아무런거 없는 int라고 적어주면
컴파일러가 이것을 그냥 후위연산자로 인식을 한다.
일단은 이렇게 구현을 해주고 뭐가 호출되는 지 확인을 해보도록 하자.
"++"가 앞에 붙든 뒤에 붙든 호출 시점은 똑같다.