class Point
{
private:
int xpos;
public:
Point(int x=0):xpos(x){}
void Show()const
{
cout << xpos << endl;
}
friend Point operator--(Point &ref);
};
Point operator--(Point &ref)
{
cout <<"처음값:"<< ref.xpos << endl;
ref.xpos -= 1;
ref.Show();
cout <<"연산후 값:"<< ref.xpos << endl;
ref.Show();
return ref;
}
int main()
{
Point pos(5);
--(--(--pos));
pos.Show();
}
존나 간단한 건데 예전꺼 복습겸 참조자 증명하다가 혼자 예제 만들면서 내가생각한게 맞는지?
참조자로 넣어서 참조자로 반환하면 메인에서 출력값이 2가 나오는건 당연한거고
여기서
(1) 반환형을 위에처럼 한다해도 생각에는 들어가는게 참조자로 들어가니 main 에서 출력하면 2가 나올거라 생각하겠지만 4가 나온다.
(2) 그런데 웃긴건 연산자 오버로딩 함수내에서는 2까지 쭉쭉내려가다가 메인에서는 4가 나온다
(3) 왜냐하면 처음 연산되는 --pos는 pos의 참조로 들어가고 그 이후로 되는 --연산은 ref의 참조로 들어가기때문임 그리고 연산이 다되면 ref는 날라감
(4) 고로 메인에서도 2를 뿌려줄려면 참조의 값을 반환시키고 다시 그 참조값을 넣어줘야함
이게 맞는거냐? 아니면 다른거냐 확신이 안선다
3번부터 뭐라는지 모르겠다
전위연산자인데 반환타입이 참조형이 아니니까 저렇게 연쇄적으로 호출하면 임시객체에 대해서 --를 호출함
처음 전위연산--만 실제 xpos를 바꾸고 그 뒤에 --는 이 전 호출의 반환값으로 나온 임시객체에 대해 --를 호출함 ref를 리턴할때 복사가 일어나고있음
대충 님말이 맞는듯
이걸 왜하냐면 그냥 나혼자만가지고 있는 지식으로 감으로 짜는것 보다 이렇게 설명하려고 하니까 좀 더 각인되서 그런건데 음 개념적 단어선택이랑 좀더 정리해야할 필요가 있는것 같네.. 여튼 ㄳㄳ
인생필패//되서->돼서 (되어 = 돼임) [리듬 맞춤법 봇♬]