중요한! 임시 객체 #2_캐스팅!

보물창고·2022년 9월 8일
0
post-thumbnail

참조 리턴 vs 값 리턴

  • 전역변수를 값으로 리턴하면, 전역변수더라도, 임시객체가 생성됨.
  • 전역변수를 참조로 리턴하면, 임시객체가 생성되지 않음.
    -> 아래의 그림을 통해 참조 리턴하는 함수에 접근해 객체 멤버를 변경하는 것을 확인할 수 있음.

- 함수 중에서 언제 참조리턴을 하고있을까?
: vector에서 값 set할때
-> 사실 v.operator = 4; 가 호출되고 있는 것임.
--> 참조 형식으로 되어있다는 것을 유추할 수 있음.

problem

: 원형타입도 그대로 적용됨.
int x, foo x값리턴 ,goo x참조리턴 함수를 만들어서
main에서 foo, goo 함수에 접근해서 x의 값을 변경후 출력하라.

임시 객체가 생성되는 다양한 경우

😱핵심 : 1. 값 캐스팅은 임시객체를 만듦.

  • 외워야 함.

value 캐스팅은 임시객체를 생성함.
참조 캐스팅은 원본 임.

problem

: 아래의 예시코드의 결과를 보자.

  • 값참조로 인해 복사생성자로 임시객체가 생성되는지 확인해보자.
    : 엇!! 값 캐스팅을 하니까, 진짜 복사로 인해 임시객체가 생성했다가 소멸됨을 확인할 수 있다.
    : 그런데 참조 캐스팅의 경우, 복사가 발생하지 않는다.
  • 임시객체는 lValue가 될 수 없다는 특성을 이용해서
    확인해 보아라. , 참조 캐스팅, 값캐스팅 한 이후에 바로 4를 대입하라.

    -> value로 캐스팅하니까, 오류가 뜨네...? 뭐지

: value 캐스팅은 가능하지만, .data 에다가 4를 대입하려고 하는 부분에서 에러가 발생한다.
즉 value 캐스팅은 임시객체 라는 것을 알 수 있다.

2. 연산자와 임시 객체

  • 전위형과 후위형에 대해서

- 책을 보거나, 선배들이 하는 말 : 후위 객체 말고, 전위 증감 연산자를
사용하라고 함. 그 이유가 무엇일까?? 에 대해 알아보자.

😱 핵심 : 후위 연산자는 임시객체를 생성한다.

😱 핵심 : 전위 연산자는 참조를 반환한다.

  • problem : 둘 중에 어떤게 가능한가?

    ++n = 4?
    n++ = 4?

-> 결과가 어떻게 될지 예상해야 함.
++n = 4만 가능하다.

  • 결과는 4가 나온다! 왜냐하면 ++n 처리 이후에 바로 값을 넣는 거다.

  • n++; 은 불가함을 확인할 수 있따.

개념 : 후위형은 전위형과 구분하기 위해 1번째 인자로, int를 사용함. (의미는 없음.)

  • 전위형은 인자 없다. operator++();

problem

: 클래스 object에 전위형과 후위형 증가연산자를 만들어서 내부 데이터
data를 증가시켜라 .

  • 전위형은 ++(++n); 이 가능함.
    -> 이것이 의미하는 바가 힌트임.

결론

  • 전위형은 참조 리턴임.
  • 후위형은 값 리턴임.

임시 객체와 멤버 함수

: 많이 활용하지는 않지만, 알아두자.

멤버 함수는 클래스의 메모리에 올라가는 것이 아니므로 임시객체로 접근이 가능함.

  • problem : 확인하라.

참조 한정사

: 함수 선언 뒤에 & ,&& 의 의미 (c++11에서 추가되었다고 함.)

  • void func() & : lvalue 객체에서만 호출이 가능함.

  • void func() && : rvalue 객체에서만 호출이 가능함.

  • problem : 확인하라.

    • rValue 객체는 호출 불가함.
    • lValue 객체는 호출 불가함.

활용

: 아래의 코드를 보면, 참조 변수가 파괴되는 객체의 멤버 데이터를 받고 있는데,
복사를 통해 이를 가능케 하고 있음...

  • 하지만, 파괴되는 객체의 데이터를 참조한다는 것은 옳은 것이 아니므로,
    이를 차단할 수 있음.

활용 : 업그레이드 내용

https://velog.io/@kwt0124/%EC%B0%B8%EC%A1%B0-%ED%95%9C%EC%A0%95-%EB%A9%94%EC%84%9C%EB%93%9C

profile
🔥🔥🔥

0개의 댓글