CPP_어소_64_iterator (5)

CJB_ny·2022년 7월 6일
0

CPP_AROTHO

목록 보기
63/83
post-thumbnail

후위연산자의 반환타입 ❗

이부분인데

호출 시점은 동일하다고 저번시간 까지 했었다.

이부분은 참조가 아니라서 복사본을 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 클래스에는 복사생성자 없다 (=>자동으로 만들어주기 때문에)

operator -- 직접 만들어라.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글