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