[Modern C++ 정리] Move 2

C++ 2022. 9. 8. 20:40

지난 Move 1 포스팅에서는.. 임시 객체(rvalue)를 가리킬 수 있는 rvalue reference lvalue를 가리킬 수 있는 lvalue reference rvalue, lvalue 둘다 가리킬 수 있는 const lvalue reference 에 대하여 알아보았다. 조금더 확장하여.. 함수 파라미터 관점에서 동일하게 알아보자. Point 구조체이다. 위 코드 처럼 함수 오버로딩이 가능하다. 1번 함수는 Point 구조체를 lvalue reference로 lvalue를 받을 수 있도록 하였다. 2번 함수는 const lvalue reference로 lvalue, rvalue 모두 받을 수 있도록 하였다. (상수성) 3번 함수는 rvalue reference로 rvalue를 받을 수 있도록 하..

Article Thumbnail
[Modern C++ 정리] Temporary 6

C++ 2022. 9. 6. 23:29

이번엔 캐스팅과 관련된 temporary를 알아보자. Base 클래스는 부모 클래스 Derived 클래스는 자식 클래스로 사용되고 있다. 부모, 자식 클래스 모두 value라는 맴버 변수를 선언하였다. main() 함수를 보자.. Derived 클래스(자식 클래스)의 지역 변수 객체 d를 선언하였다. d.value는 당연하게도 20이 출력된다. 25 line에서는 d를 Base&로 타입 캐스팅 하였다. 27 line에서는 d를 Base로 타입 캐스팅 하였다. 여기서.. 지난번 temporary가 반환 될때의 포스팅에서와 동일하게.. d가 Base 타입의 임시객체로 복사되어 만들어진다. 그리고 생성된 임시객체의 value를 출력하게 된다. 27 line이 임시객체가 만들어진 증명은 34 line에서 보여주..

Article Thumbnail
[Modern C++ 정리] Temporary 5

C++ 2022. 9. 6. 23:12

temporary 4 포스팅에 이어서 함수 반환으로 임시객체를 사용할 때 주의 사항을 알아보자.. Counter 클래스는 increment() 함수에서 자기자신을 임시객체로 복사하여 넘기고 있다.. call by value this는 맴버 함수가 호출된 객체의 주소를 가리키는 숨겨진 포인터이다. Counter2 클래스는 increment() 함수에서 자기자신을 참조로 넘기고 있다. call by reference main() 함수를 살펴보자.. 개발자는 Counter를 지역 변수로 선언하였다. (스택 메모리) 그리고.. value를 3으로 증가시키기 위하여 c.increment() 를 3회 호출 하였다. 개발자는.. 단순하게.. c.increment(); 를 3회 작성한 코드에서 위와 같이 변경해보았다...

Article Thumbnail
[Modern C++ 정리] Temporary 4

C++ 2022. 9. 6. 22:47

반환되는 temporary에 대해 알아보자.. 사용되는 class 선언부 이다. 전역 변수로 Point 객체를 선언하였다. (line 26) f1()함수는 리턴되는 타입이 Point 로 선언되어있다. -> 리턴용으로 pt가 복사되어 반환된다. -> 이때 반환되는 객체는 임시 객체이다. f2()함수는 리턴되는 타입이 Point& 로 선언되어있다. -> 참조를 반환하여 전역변수 pt 그 자체를 반환한다. f3() 함수는 f2() 함수와 마찬가지로 Point&를 반환한다. 하지만.. 내부를 보면, 이름있는 지역 변수 객체 p를 참조로 반환 중이다. 지역변수는 f3()함수 블럭이 끝나는 순간 파괴된다. 따라서.. p 객체 그 자체를 반환하는데... 함수를 벗어나자마자 파괴 되므로 말이 안되는 상황이다. 결론. ..

Article Thumbnail
[Modern C++ 정리] Temporary 3

C++ 2022. 9. 6. 00:28

함수 인자에 temporary를 사용할 때를 알아 보겠다. 이전 포스팅과 동일한 Point 클래스 선언 foo 함수는 함수 인자로 포인트 객체를 요구한다. 상수 참조 자료형 사용 (이전 포스팅 참조) 상수 이므로 함수 내부에서는 pt를 수정 할 수 없다. goo 함수는 함수 인자로 Point 객체의 reference를 받도록 하였다. 개발자의 의도는 인자로 받은 객체를 수정하고 싶다는 것이다. (상수 const 키워드를 뺌) 하지만.. 해당 인자 자료형으로는 임시 객체를 받을 수 없다. (이유는.. main 함수에서 사용하는 코드에서 알아보겠다..) main() 함수를 보겠다. 이름 있는 객체 pt를 선언하고.. 이를 foo 함수에 넣어주었다. (상수 참조 자료형으로 넣음) pt는 main() 함수가 끝..

Article Thumbnail
[Modern C++ 정리] Temporary 2

C++ 2022. 9. 5. 23:55

계속하여 temporary에 대해 알아보자. temporary의 특징 Point 클래스를 선언하였다. 생성자 / 소멸자에서 호출 여부 출력용 로그를 작성하였다. main() 함수에서.. 이름 있는 객체 pt를 선언하였다. 이름 있는 객체는 lvalue로 사용 가능하다. (22 line) 임시 객체는 rvalue로 부를 수 있으며, 등호의 왼쪽에 올 수 없다. (23 line) 하지만, 임시 객체가 상수는 아니다. (26 line) 따라서, 함수 호출은 된다. main() 함수의 연속이다. 이름있는 객체 pt의 주소를 p1에 복사 대입 해주었다. Point(1, 2) 임시객체의 주소를 p2에 복사 대입 해주기를 시도 한다. 하지만.. 임시 객체는 주소 연산자로.. 주소를 구할 수 없다. (단, Point ..

Article Thumbnail