while (1): study();

[C++] 복사생성자의 호출 시기 본문

학습/C, C++

[C++] 복사생성자의 호출 시기

전국민실업화 2021. 12. 20. 22:19
728x90

복사 생성자는 메모리 공간의 할당과 초기화가 동시에 일어나는 상황에 호출된다. 좀 더 디테일하게는 세 가지 상황으로 나누어진다.

  1. 기존에 생성한 객체로 새로운 객체를 초기화하는 경우
  2. call-by-value 방식으로 객체를 함수의 인자로 전달하는 경우
  3. 함수가 참조형이 아닌 객체를 반환하는 경우

 

1. 기존에 생성한 객체로 새로운 객체를 초기화하는 경우

 

 

Object obj2 = obj1;
Object obj2(obj1);

가장 대표적인 복사 생성자 호출 방식이다. 이 경우 obj2를 저장할 메모리 공간을 할당함과 동시에 obj1과 멤버 대 멤버 얕은 복사가 발생하여 새로운 객체를 호출한다.

 

2. call-by-value 방식으로 객체를 함수의 인자로 전달하는 경우

 

void Function(Object obj)
{
// ...
}

int main(void)
{
    Object obj;
    Function(obj);
    
    return 0;
}

call-by-value 방식으로 객체를 함수의 인자를 넘겨주게 되면, 매개변수는 스택 영역에 지역변수 공간을 할당한 뒤 넘겨받은 인자를 멤버 대 멤버 복사한다. 따라서 이 경우도 복사 생성자가 호출된다.

 

3. 함수가 참조형이 아닌 객체를 반환하는 경우

 

Object Function(void)
{
    Object obj;
    return obj;
}

  마지막으로 함수에서 참조형이 아닌 객체를 반환하는 경우에도, 함수 호출자에서 반환값을 받을 수 있는 메모리 공간을 할당한 뒤 반환값과 멤버 대 멤버 복사하고 지역변수는 스택 영역에서 제거된다. 따라서 복사 생성자가 호출된다.

728x90
Comments