복사 생성자의 호출시점

복사 생성자의 호출횟수는 프로그램의 성능과도 관계가 있기 때문에, 호출의 시기를 이해하는 것은 매우 중요하다.


복사 생성자가 호출되는 시점은 크게 세가지로 구분할 수 있다.


첫번째, 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우.

두번째, Call-By-Value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우.

세번째, 객체를 반환하되 참조형으로 반환하지 않는 경우.


위의 세가지는 "객체를 새로 생성해야 한다. 단, 생성과 동시에 동일한 자료형의 객체로 초기화해야 한다." 는 공통점을 지닌다.


ex1) Simple obj2 = obj1;

: obj2 객체가 생성되면서 (obj2를 위한 메모리 공간이 할당되면서) 초기화도 이뤄진다.


ex2) Simple Func(Simple ob)

{

.......

}

int main(void)

{

Simple obj;

Simple Func(obj);

}

: ob 객체가 생성되면서 전달되는 인자로 초기화가 이뤄진다.


ex3) Simple Func(Simple ob)

{

.............

return ob;

}

: return 문이 실행되는 순간, Simple 객체를 위한 메모리 공간이 할당되고, 이 공간에 할당된 객체는 반환되는 객체 ob의 내용으로 초기화가 이뤄진다.






복사 생성자를 통한 초기화




32행: 23행에 선언된 매개변수 ob 의 복사 생성자가 호출되면서, 인자로 obj가 전달된다.






35행: Func 함수가 반환한 객체를 대상으로 AddNum 함수를 호출하고, 이어서 AddNum 함수가 반환하는 참조 값을 대상으로 ShowData 함수를 호출하고 있다.






임시객체


: 임시객체도 임시변수와 마찬가지로 임시로 생성되었다가 소멸되는 객체이다.


- 임시객체를 직접 생성하는 방법 -


위의 예제에서 내릴 수 있는 결론 두 가지

1. 임시객체는 다음 행으로 넘어가면 바로 소멸되어 버린다.

2. 참조자에 참조되는 임시객체는 바로 소멸되지 않는다.


클래스 외부에서 객체의 멤버함수를 호출하기 위해 필요한 것은 다음 세 가지 중 하나이다.

1. 객체에 붙여진 이름

2. 객체의 참조 값

3. 객체의 주소 값


Temporary(200).ShowTempInfo();

임시객체가 생성된 위치에는 임시객체의 참조 값이 반환된다. 즉, 위 문장의 경우 먼저 임시객체가 생성되면서 다음의 형태가 된다.

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


그래서 이어서 멤버함수의 호출이 가능한 것이다.


또한 이렇듯 "참조 값"이 반환되기 때문에 다음과 같은 문장의 구성도 가능하다

const Temporary &ref = Temporary(300);


위의 경우는 임시객체 생성시 반횐되는 "참조 값"이 차모자 ref에 전달되어, ref가 임시객체를 참조하게 된다.


※ 임시객체는 메모리에 저장되고, 그 객체의 참조 값이 반환된다.






Simple tempRef = Func(obj);


언뜻 보면, tempRef라는 새로운 객체를 생성해서, 반환되는 객체를 가지고 대입연산을 진행하는 것처럼 보인다. 그러나 위의 출력결과에서는 추가로 객체를 생성하지 않고, 반환되는 임시객체에 tempRef라는 이름을 할당하고 있음을 보여준다(객체의 생성 수를 하나 줄여서 효율성을 높이기 위해서).

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

friend  (0) 2012.05.26
const 객체와 const 객체의 특성 그리고 const 함수 오버로딩  (0) 2012.05.26
깊은 복사 & 얕은 복사  (0) 2012.05.24
explicit  (0) 2012.05.23
복사 생성자(Copy Constructor)  (0) 2012.05.22
Posted by scii
: