Class GameDev* SheepAdult

[C++] 복사 생성자 본문

C++

[C++] 복사 생성자

SheepAdult 2022. 9. 3. 03:08

 복사 생성자는 언제 호출되는가? 기본적으로 대입 연산자(ex. =)를 사용하여 복사를 할 때 생성된다. 이는 기존에 생성된 객체를 이용해 새로운 객체를 초기화한 경우이다. 이뿐만 아니라 참조가 아닌 복사 방식인 Call-by-value방식에서 함수 호출 시 객체를 인자로 전달하는 경우, 그리고 객체를 참조형으로 반환하지 않는 경우에도 복사 생성자가 호출된다.

 

 함수의 매개변수가 참조자가 아닌 경우 복사가 일어난다. 인자를 매개변수에 대입하는 과정에서 발생한다. 그리고 return으로 반환 시 해당 return 값에도 복사 생성자를 통한 복사가 일어난다. 일반적으로 함수가 종료되면 안에서 선언된 변수나 객체는 소멸되는데 반환되는 객체는 '임시 객체'로써 일단 소멸되지 않는다.

 

아래와 같이 클래스와 함수가 있다.

class Practice
{
public:
	Practice()
	{
		cout << "Default Constructor" << '\n';
	}

	Practice(const Practice& copy)
	{
		cout << "Copy Constructor" << '\n';
	}

	~Practice()
	{
		cout << "Destruct" << '\n';
	}
};

Practice PracticeFunction(Practice p)
{
	cout << "Practice!" << '\n';
	return p;
}

int main()
{
	Practice p1;	// (1)
	PracticeFunction(p1);	// (2)
	Practice p2 = PracticeFunction(p1);	// (3)
	cout << "End..." << '\n';	// (4)
	return 0;	//(5)
}

출력결과는 아래와 같다.

a : (1)에서 p1이 생성되어 기본 생성자가 호출된다.

b : 그 후 (2)에서 매개변수에 대한 복사 생성자가 호출되고

c : 해당 함수의 내용을 출력한 뒤

d : 반환 값에 대하여 다시 한번 복사 생성자를 호출한다.

e, f: 그리고 함수를 종료하므로 매개변수 객체, return에서 생성된 객체는 소멸된다.

g : 그리고 (3)에서 p1이 인자로 생성된 객체에 복사된다.

h : 함수의 내용을 호출한 뒤

i : return에 의해 객체가 한 번 더 생성된다.

j : 하지만 임시 객체로써 아직 i의 객체는 살아있고 g의 객체는 소멸된다.

k : end가 출력되고,

l, m : 임시 객체가 소멸되고 이어서 p1도 소멸된다.

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

Multi Thread를 활용한 간단한 1:N 채팅 서버  (0) 2023.12.30