본문 바로가기

강의자료/C/C++

041. 클래스의 객체를 복사하자.


◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


클래스의 객체를 복사하기 위한 방법을 알아본다.
클래스로 만들어진 객체는 대입연산자를 이용하여 복사될수도 있지만 복사가 제대로 되지 않을수도 있다.
이를 위해서 클래스에는 복사생성자라는 것이 존재하고 이를 이용하여 복사가 완전하게 이루어지도록 하게된다.
즉, 여기서는 복사생성자의 사용방법에 대해서 알아본다.
// 복사생성자에 대해서 이해한다.
// 함수 파라미터에 쓰이는 const와 멤버함수 선언에 사용되는 const의 차이를 이해한다.
// ->const함수안에서는 const함수만 쓸수있다. (예, getX함수에서는 position함수를 사용못한다.)
// 같은 클래스 객체끼리는 private멤버에 접근이 가능하다.
// position()함수에도 const를 붙여보자.

#include 
using namespace std;

class Point  
{
private:
	int x;
	int y;

public:
	Point(int _x, int _y);
	~Point();

	void position();
	void move(int _x, int _y);

	// 복사생성자.
	Point(const Point& p);  
	Point(const Point* p);

	int getX() const {return x;}  //값을 바꿀 수 없다. 
	int getY() const {return y;}  //값을 바꿀 수 없다. 
};

Point::Point(int _x, int _y)
{ 
	x=_x;  
	y=_y;
}

Point::Point(const Point& p)
{
	x=p.getX();
	y=p.getY();                     
}
Point::Point(const Point* p)
{
	x=p->getX();
	y=p->getY();                   
}

Point::~Point()
{
	cout << "Point die~~." << endl;                
}

void Point::position()
{
	cout << "(" << x << " , " << y << ")" << endl;     
} 

void Point::move(int _x, int _y)
{
	x+=_x;  //_x만큼 이동  
	y+=_y;  //_y만큼 이동     
}

int main()
{
	//Point p1 = 100; //생성자 추가하면 가능, explicit와 함께 설명.
	Point p5(5,8);  //스택에 객체 생성 
	Point p6(p5);   //복사 생성자 Point(const Point &p) 실행.
	Point p7=p5;    //복사 생성자 Point(const Point &p) 실행.
	Point* p8=new Point(2,7); // 생성자 실행. 힙에 객체 생성.
	Point* p9=new Point(p8);  // 복사 생성자 Point(const Point *p)실행. 힙에 객체 생성.
	cout << "p5.position  "; p5.position();
	p5.move(4,5);  //(5, 8)를(4, 5)만큼 이동  
	cout << "p5.position  "; p5.position();
	p6.move(3, 6);  //p5와 p6는 개별  (5+3, 8+6)
	cout << "p5.position  "; p5.position(); 
	cout << "p6.position  "; p6.position();
	cout << "p7.position  "; p7.position();    //(5,8)
	p8->move(3,6);  //(2+3, 7+6)
	p9->move(2,-3); //(2+2, 7-3)
	cout << "p8.position  "; p8->position();   //p8과 p9는 개별  

	delete p8;
	delete p9;

	return 0;
}