복사 생성자.

보물창고·2022년 8월 16일
0

c++ basic 코드누리

목록 보기
28/50

테스트해볼꺼 240730

: 아래 3) 함수에서 객체를 value 타입으로 반환할때에 대해서
호출코드에서 반환받지 않아도 복사가 이루어지는 것에 대해서
fundametal c++ 책에도 있다. 공부하고 정리해서 추가하자.
-> 3)번 예제 밑에다가 정리해놓음.

개념

: 객체의 복사본을 만들어내는 생성자.
const lvalue &(참조)를 인자로 받고 있다.

사용자가 복사 생성자를 만들지 않으면,

  • 컴파일러가 알아서 디폴트 복사 생성자를 만듦.
  • 특징
    : 모든 멤버들 간의 복사가 이루어짐.
  • 문제점
    : 멤버로 포인터가 있을 경우, 얕은 복사가 발생할 수 있음.
    -> 왜냐면 소멸자에서 포인터 삭제하면, 하나의 자원에 대해 2번 해제하게 되므로.

problem

가 ) CPoint p; CPoint p2(p); 를 해보고, p2의 멤버 데이터를 출력하라.
: 이때 인자2개인 생성자만 만들자.
-> 컴파일러가 디폴트 복사 생성자를 호출한 것을 확인할 수 있음.

복사생성자의 모양

CPOint(const CPoint &obj) {}

복사 생성자가 호출되는 3가지

1) 자신과 동일한 타입의 객체로 초기화될 때

problem

cPoint p1(1,2);
cPoint p2(p1);
cPoint p3{p1};
cPoint p4 = {p1};
cPoint p5 = p1;
을 작성하고 , 출력하라.

현재 복사 생성자 호출도, 직접 초기화 복사 초기화로 구분됨.

  • explicit 키워드를 작성해서 복사 초기화를 방지하라.

2) 객체를 call by value로 사용할 때

  • 방지하는 방법은 const & 를 사용하면 됨.

problem

: 클래스 Point를 만들고, foo 함수를 만들어 인자로 가 ,나 를 적용하고,
객체 생성하고, foo에다가 인자로 넣어보자.

가) call by value로 호출해보아라
나) call by ref로 호출해보아라.


-> 유저타입 복사생성자에서 data 처리를 하지 않아서 , 쓰레기 값이 출력됨.
-> call by ref 호출로 인해 복사생성되지 않고,
원본의 데이터가 출력됨을 확인함.

3) 함수에서 객체를 value 타입으로 반환 할 때

: c++에서의 value 반환은 무조건 복사를 생성함.
무조건이 아니다. 아래의 Problem 예시코드를 보면, 상황에 따라 다르다.
참조 반환은 복사생성을 방지함.

결과
: 리턴용 임시 객체가 생성될 때, 복사생성자가 호출됨.

problem

가) 전역 객체를 만들고, 함수에서 전역 객체를 value로 반환해보자.

-> 값반환이어서 복사객체를 생성하고 있음.
심지어 호출자 코드에서 반환함수를 받고 있지 않는다...

나) 참조로 반환해보자.
-> 여기서는 참조 반환이어서 복사 발생하지 않음.

다) value 반환일때는 복사가 바로 발생하지 않는다.

  • 반환타입으로 함수를 받더라도 rvo 최적화로 인해 복사 없다.

함수에서 참조를 반환하지만, 지역객체를 반환한다면??

-> 위의 내용을 해보자.

profile
🔥🔥🔥

0개의 댓글