C++문법 공부

복사 생성자

막뇌 2023. 6. 9. 12:15
#include <iostream>
using namespace std;
//Point 클래스를 정의한다.
class Point
{
public:
	//맴버 변수
	int x, y;
	//맴버 함수
	void Print();

	//생성자들
	Point();	//디폴트 생성자
	Point(int initialX, int initialY);	//인자가 있는 생성자
	Point(const Point& pt);	//복사 생성자
};
Point::Point(const Point& pt)
{
	cout << "복사생성자 호출됨!!" << endl;
	x = pt.x;
	y = pt.y;
}
//복사생성자는 자신과 동일한 타입의 객체에 대한 레퍼런스를 인자로 받는다. 그리고 이 객체의 각 맴버 변수의 값을 복사하게 코드를 작성하는 것이 일반적이다.

Point::Point(int initialX, int initialY)
{
	x = initialX;
	y = initialY;
}

Point::Point()
{
	x = 0;
	y = 0;
}
void Point::Print()
{
	cout << "(" << x << ", " << y << ")\n";
}
int main()
{
	//객체를 생성한다.
	Point pt1(100, 100), pt2(200, 200);

	//pt1을 사용해서 새로운 pt3을 초기화한다.
	Point pt3 = pt1;	//다른 객체를 사용해서 초기화하는 경우에 복사생성자가 호출된다.

	//pt3의 내용을 출력한다.
	pt3.Print();

	//pt2를 pt3에 대입한다.
	pt3 = pt2;	//다른 객체를 대입하는 경우에는 복사 생성자가 호출되지 않는다.

	//pt3의 내용을 출력한다.
	pt3.Print();

	return 0;
}

복사생성자가 호출되는 문장을 살펴 보겠습니다.

Point(const Point& pt);	//복사 생성자 선언부

Point::Point(const Point& pt)	//복사 생성자 정의부
{
	cout << "복사생성자 호출됨!!" << endl;
	x = pt.x;
	y = pt.y;
}

선언부를 보면 매개변수로 자신과 동일한 타입의 객체에 대한 레퍼런스를 받습니다.

지금은 레퍼런스 이름을 pt라고 이름 붙였네요

 

선언과 정의는 저런 모양으로 하는데

사용은 어떻게 할까요?

 

Point pt3 = pt1;

위와 같이 사용할 때, 복사 생성자가 호출됩니다.

다른 객체를 사용해서 초기화 할 때입니다.

pt3 = pt2

위와 같이 그냥 값을 복사해서 대입하는 상황에서는 복사 생성자가 호출되지 않습니다.