: 아래 3) 함수에서 객체를 value 타입으로 반환할때에 대해서
호출코드에서 반환받지 않아도 복사가 이루어지는 것에 대해서
fundametal c++ 책에도 있다. 공부하고 정리해서 추가하자.
-> 3)번 예제 밑에다가 정리해놓음.
: 객체의 복사본을 만들어내는 생성자.
const lvalue &(참조)를 인자로 받고 있다.
가 ) CPoint p; CPoint p2(p); 를 해보고, p2의 멤버 데이터를 출력하라.
: 이때 인자2개인 생성자만 만들자.
-> 컴파일러가 디폴트 복사 생성자를 호출한 것을 확인할 수 있음.
CPOint(const CPoint &obj) {}
cPoint p1(1,2);
cPoint p2(p1);
cPoint p3{p1};
cPoint p4 = {p1};
cPoint p5 = p1;
을 작성하고 , 출력하라.
현재 복사 생성자 호출도, 직접 초기화 복사 초기화로 구분됨.
: 클래스 Point를 만들고, foo 함수를 만들어 인자로 가 ,나 를 적용하고,
객체 생성하고, foo에다가 인자로 넣어보자.
가) call by value로 호출해보아라
나) call by ref로 호출해보아라.
-> 유저타입 복사생성자에서 data 처리를 하지 않아서 , 쓰레기 값이 출력됨.
-> call by ref 호출로 인해 복사생성되지 않고,
원본의 데이터가 출력됨을 확인함.
: c++에서의 value 반환은 무조건 복사를 생성함.
무조건이 아니다. 아래의 Problem 예시코드를 보면, 상황에 따라 다르다.
참조 반환은 복사생성을 방지함.
결과
: 리턴용 임시 객체가 생성될 때, 복사생성자가 호출됨.
가) 전역 객체를 만들고, 함수에서 전역 객체를 value로 반환해보자.
-> 값반환이어서 복사객체를 생성하고 있음.
심지어 호출자 코드에서 반환함수를 받고 있지 않는다...
나) 참조로 반환해보자.
-> 여기서는 참조 반환이어서 복사 발생하지 않음.
다) value 반환일때는 복사가 바로 발생하지 않는다.
-> 위의 내용을 해보자.