이부분인데
호출 시점은 동일하다고 저번시간 까지 했었다.
이부분은 참조가 아니라서 복사본을 return 하기때문에
반환하는 것은 또다른 복사본이라 사라짐.
그래서 this로 복사본을 만들고
++후위를 호출한 객체를 ++ 연산자 써주어서 호출하고
return 으로는 복사본을 반환을 해준다.
int iData = *(++myiter); => 20이 나오고
int iData = *(myiter++); => 10이 나옴.
10이 나오는 이유가
myiter++를 호출하게되면
원본은 이미 ++(*this)로 늘려주었는데
반환하는 것이 지금 copy_iter == 복사본이라
myiter++는 현재 값이 증가하기전의 복사본의 값이 들어아있는 상태임
즉 *(copy_iter)가 이렇게 들어가있고 이것의 원본에 다가가겠다라는 의미이다.
원본은 이미 증가한 상태임.
딱히 동작하는 데에는 문제가 없는데
후위연산자를 쓰면
비용이 조금 더 든다.
전위를 쓰든 후위를 쓰든 상관없을 때,
쓸데없는 객체 삭제 비용이 생긴다.
쓸데없는 객체가 두번 만들어진다.
먼저 후위 ++에서 복사를 하고 종료되면 삭제되고,
return 해야되기때문에 return 객체 만들어지고, return 자리에 들어간다음에 삭제 되고.
이 Test라는 클래스들 끼리의 대입이 발생하면은
operator = 가 호출이 된다.
operator 대입연산자는 내가 굳이 구현해주지 않아도
자동으로 만들어진다.
=> 그래서 이 클래스의 객체들끼리의 대입이 발생할 수 있었다.
상대방을 참조해와서 안에 값을 m_i에 복사를 한다.
이것도 내가 굳이 만들지 않더라도 알아서 구현이 되는 부분이다.
이 "복사 생성자"는 내가 구현해놓지 않으면 자동으로 구현될 녀석이다.
즉, 굳이 안 만들어도 되는 부분을 만들었기 때문에
"컴파일러"는 기본 생성자를 만들어주지 않는다.
그래서 아까 에러 안뜨던 부분들이 에러가 뜬다.
생성자를 하나라도 직접 구현한게 있다면
c++ 컴파일러는 기본생성자를 제공해 주지않는다.
그냥 기본생성자 하나 만들어야한다.
기본 생성자 호출해서 m_i에 0넣고
그다음에 t1 = t2 operator = 호출해서 다시 100의 값을 넣는데
이렇게 하지말고
이럴때 바로 복사생성자 호출하면됨.
생성자를 호출하는데 인자로 나랑 똑같은 타입을 받는다.
즉, 객체 생성과 대입을 동시에 해보린다.
(뭘까...?)
겉으로 보기에는 대입연산자 같다.
그런데 대입을 받을려면 t3라는 객체가 먼저 만들어져있어야지
대입을 받지 ㅄ아.
그러면 CTest의 객체 t3가 만들어지고(생성자를 호출하고)
그리고 나서 t1을 대입받은 거잖아.
그런데 지금
CTest t3 = t1;은
은 객체 생성과 동시에 대입을 받고있는 상황이다.
그럼 이것을 결국 또 복사 생성자로 한번에 처리가 가능하지 않노?
그래서
CTest t3 = t1
처럼 "객체" 생성과 동시에 "대입"을 받으면은
c++컴파일러가 알아서 이것을
CTest t3(t1);
복사 생성자로 바꾸어준다.
객체 생성과 동시에 대입을 하는 것은 "복사 생성자"이다.
아까 이부분이 뭐냐하면은
iterator copy_iter = *this 는
복사 생성자를 호출한 것이다!
우리가 구현한 iterator 클래스에는 복사생성자 없다 (=>자동으로 만들어주기 때문에)