C++ 프로그래밍/클래스

객체의 복사와 복사 생성자

같은편 2022. 7. 28. 12:55

같은 자료형의 변수들을 복사하는 것과 같이 객체도 서로 복사할 수 있습니다.

바로 대입연산자(=)와 복사생성자 두 가지의 이유로 복사할 수 있습니다.

  • 대입연산자 이용
Point p(2,3), q; 
q = p;
  • 복사생성자 이용
    1. printPoint함수에서 매개변수로 객체를 전달하는 과정에 Point a가 p로 복사 생성자를 이용하여 객체 복사
    2. readPoint함수에서 Point p 함수를 반환하면서 복사 생성자를 이용하여 객체 복사
#include <iostream>
using namespace std;

struct Point {
	int  x, y;
	Point(int xx = 0, int yy = 0) : x(xx), y(yy) { }
};

Point readPoint() {
	Point p;
	cout << "좌표를 입력해주세요(x,y): ";
	cin >> p.x >> p.y;
	return p;
}
void printPoint(Point p, char* str = "Point") {
	cout << str << "= (" << p.x << "," << p.y << ")\n";
}
void main()
{
	Point a;
	a = readPoint();
	printPoint(a, "입력 좌표");
}

 

복사 생성자(coppy constructor)는 다음과 같이 특정한 매개변수를 갖는 생성자를 부르는 말입니다.

클래스명( const 클래스명 & 참조객체명) { }

 

예: Point( const Point& p) : x(p.x), y(p.y) { } // 클래스 참조객체명 p를 매개변수로 받아 값을 초기화하는 함


복사 생성자가 호출되는 경우 3가지

  1. 다른 객체로부터 새로운 객체를 생성할 때
  2. 함수의 매개변수로 객체가 전달될 때
  3. 함수가 객체를 반환할 때

첫 번째는 그렇게 중요하지 않지만 2,3번은 중요합니다.

 

다행히 일반 생성자와 같이 사용자가 만들지 않아도 디폴트 복사 생성자가 알아서 만들어 제공해 줍니다.