개발/C++

C++. 복사 생성자와 복사 대입 연산자의 차이

ordi2016. 11. 15. 08:17

C++.

복사 생성자 (Copy Constructor) 와

복사 대입 연산자 (Copy Assignment Operator) 의

차이


참고 : Effective C++




처음에 복사 생성자와 복사 대입 연산자를 공부하고 나면, 언제 이 친구들이 호출되는지 어지러운 경우가 많습니다. 저 또한 그랬기 때문에 이 글을 작성하며 헷갈리는 점을 해소하려합니다. 그래서 다음과 같이 글을 진행하려 합니다.


1. 기본적인 호출시기

2. 함수에서 값에 의한 객체를 전달 할때는?

3. 요약

4. 소스코드





1. 기본적인 호출식


먼저 예제 클래스를 작성해 보겠습니다.



위에 코드를 참고하면, 각각의 기본 생성자, 복사 생성자, 복사 대입 연산자가 선언 되어 있습니다. 그리고 다음과 같은 메인 함수를 실행하면 어떻게 될까요.



그러면 다음과같은 출력이 완성 됩니다.


call the default constructor

call the copy constructor

call the copy constructor

call the copy assignment operator


이를 해석해 보자면,

그냥 선언을 하면 기본 생성자를,

생성시기 때 같은 타입을 인자로 넣어준다면 복사 생성자를,

생성시기 때 같은 타입을 대입 연산한다면 복사 생성자를,

그 이후 일반 상황에서 대입 연산한다면 복사 대입 연산자

사용하게 됩니다.


특히 선언시기와 동시에 대입 연산을 한다면 복사생성자를 사용한다는 점 기억해주시기 바립니다.





2. 함수에서 값에 의한 객체를 전달 할때는?


다시 말해 함수에서 객체를 Call-by-value 한다면 복사 생성자를 쓰는지, 복사 대입 연산자를 쓰는지 알아보는 실험입니다.

정답 부터 말하자면 복사 생성자를 쓰게 됩니다.


먼저 다음과 같은 함수를 작성해 보겠습니다.



이 함수를 호출 하는 메인 함수는 다음과 같습니다.




마지막 cout에서 호출이 되면 콘솔창에는 "call the copy constructor"가 출력되는 것을 볼 수 있습니다.


따라서 Call-by-value시 복사 생성자를 사용해 새로운 객체를 생성하는 것으로 생각하시면 됩니다.





3. 요약


 Test t1;        => 기본 생성자
 Test t2(t1);    => 복사 생성자
 Test t3 = t1;   => 복사 생성자
 t1 = t2;        => 복사 대입 연산자
     
 cout << isEmpty(t1) << endl;    => Call-by-Value는 복사 생성자






4. 소스코드



'개발 > C++' 카테고리의 다른 글

C++. cout 소수점 자리수 조절하기.  (0) 2016.11.08

댓글

Pmon

뭐든 간에 기록하자

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment

VISITED

Today :

Total :