while (1): study();
[C++] 복사생성자의 호출 시기 본문
728x90
복사 생성자는 메모리 공간의 할당과 초기화가 동시에 일어나는 상황에 호출된다. 좀 더 디테일하게는 세 가지 상황으로 나누어진다.
- 기존에 생성한 객체로 새로운 객체를 초기화하는 경우
- call-by-value 방식으로 객체를 함수의 인자로 전달하는 경우
- 함수가 참조형이 아닌 객체를 반환하는 경우
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
'학습 > C, C++' 카테고리의 다른 글
[C++] 벡터에 원소가 삽입되지 않을때 (0) | 2022.01.04 |
---|---|
error LNK2019 해결법 (0) | 2021.12.24 |
[C++]'const char [14]'에서 'char *'(으)로 변환할 수 없습니다. (0) | 2021.12.19 |
[C++] 정보은닉과 캡슐화 (0) | 2021.12.19 |
구조체에 대한 new & delete 연산 (0) | 2021.12.19 |
Comments