[Modern C++ 정리] Move 4

C++ 2022. 9. 8. 21:59

본격적으로 move 생성자 (이동 생성자)에 대해 알아보자.. Cat 클래스의 정의 및 선언 부이다. 16 line에서 const lvalue reference로 복사(copy) 생성자를 정의 하였다. rvalue, lvalue 모두 지원된다. 깊은 복사로 구현하였다. 24 line은 이동(move) 생성자이다. rvalue reference의 파라미터로 정의 되었다. rvalue가 지원된다. (rvalue를 넣으면 16 line 보다 우선이다.) 특징은.. 들어온 임시객체(rvalue)의 모든 값을 얕은 복사 한다. 임시 객체의 포인터 변수 name은 nullptr로 할당하여 이후, 호출 부분에서 임시객체가 파괴 될때, 포인터 변수의 name이 해제 되지 않도록 한다. 위와 같이 rvalue의 값을 변..

Article Thumbnail
[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++ 정리] Move 1

C++ 2022. 9. 7. 00:14

temporary에 이어 move에 대해 학습 해보자. 본격적으로 들어가기전에 "&" 키워드의 명칭은 원래 reference로 알고있는 경우가 많은데 사실 정확한 명칭은 lvalue reference이다. "&&" 키워드의 명칭은 rvalue reference 이다. 9 line에서 Point 클래스의 지역 변수 객체 pt를 선언하였다. 규칙 1. non const lvalue reference로는 lvalue만 가리킬 수 있다. pt는 lvalue이므로 lvalue reference (r1) 로 가리킬 수 있다. (11 line) Point()는 임시객체(rvalue) 이므로 lvalue reference로 가리킬 수 없다. (12 line) 규칙 2. const lvalue reference로는 lv..

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