관리 메뉴

ComputerVision Jack

[C++프로그래밍 Chapter5] 본문

Programming Language/C++ Programming

[C++프로그래밍 Chapter5]

JackYoon 2020. 1. 21. 20:52
반응형

[복사 생성자]

Simple sim1(15, 20);

Simple sim2 = sim1;

#sim2 객체를 새로 생성해서 sim1과 sim2간의 멤버 복사가 일어난다.

 

객체 생성시 생성자 호출 동반 관점에서 바라보자.

Simple(Simple &copy){ }

디폴트 복사 생성자

Simple sim2 = sim1 -> Simple sim2(sim1)으로 자동으로 변환

#복자 생성자를 정의하지 않으면 맴버의 복사를 진행하는 디폴트 복사 생성자가 자동으로 삽입된다.

그러나 묵시적 변환이 많은 코드일 수록 결과를 예측하기 어렵다.

 

explicit

자동으로 변환되는 것을 허용하지 않을 경우 사용되는 키워드

explict Simple(const Simple &copy) { }

[깊은 복사 vs 얕은 복사]

디폴트 복사 생성자는 멤버 대 멤버 복사 진행한다. 이는 얕은 복사(shallow copy)이다.

멤버 변수가 힙의 메모리 공간을 참조하는 경우 문제가 발생한다.

 

소멸자 출력할 경우 한번만 호출된다.

얕은 복사는 따라서 새로운 객체를 생성하고 주소값을 부여하는 것이 아닌, 기존 생성된 객체의 주소로 가리켜 복사를 진행하는 것을 알 수 있다.

즉 두개의 객체가 하나의 메모리를 참조하는 상황이 발생한다.

 

따라서 객체 별로 별도의 메모리를 참조하도록 만든다. 이를 깊은 복사(deep copy)라고 한다.

[복자 생성자 호출 시점]

  • 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우
  • Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우
  • 객체를 반환하되, 참조형으로 반환하지 않는 경우

객체를 생성해야 하는데, 생성과 동시에 동일한 자료형의 객체로 초기화해야 할 경우 라는 공통점이 존재.

메모리 공간의 할당과 동시에 초기화가 결정되는 경우.

#함수의 경우 값을 반환하면 별도의 메모리 공간이 할당되고, 반환값이 저장된다.

즉, 함수에 인자를 전달하는 과정에 대해서도, 복자 생성자가 호출됨이 보여진다.

 

객체 반환도 이와 똑같은 메세지.

객체를 반환하게 되면 임시 객체가 생성되고, 임시 객체에 대해 복사 생성자가 호출된다.

 

임시 객체

객체의 멤버 함수를 호출하기 위한 조건.

  • 객체에 붙여진 이름
  • 객체의 참조 값(객체 참조에 사용되는 정보)
  • 객체의 주소 값

(임시 객체의 참조 값).ShowTempInfo();

#임시 객체의 존재가 확인된다.

임시객체를 반환하여 객체를 초기화 할 수도 있다.

 

반응형

'Programming Language > C++ Programming' 카테고리의 다른 글

[C++프로그래밍 Chapter7]  (1) 2020.01.28
[C++프로그래밍 Chapter6]  (0) 2020.01.23
[C++ 프로그래밍 Chapter4]  (0) 2020.01.19
[c++ 프로그래밍 Chapter3]  (0) 2020.01.16
[C++ 프로그래밍 Chapter2]  (0) 2020.01.14
Comments