본문 바로가기
프로그래밍 언어/C++

[C++] 복사 생성자 (Copy Constructor)란?

by 까망 하르방 2025. 2. 4.
반응형

복사 생성자 (Copy Constructor)란?

객체가 자신과 동일한 타입의 객체로 초기화 될 때 호출되는 생성자

class A
{
    int no;
    char ch;

public:
    A(const A & ra); // 복사생성자함수
};

 

 

[예시] 복사 생성자

p2는 Point(int) 필요하지만

Point(Point) 형태로 복사 생성자로 build error 발생 X

class Point
{
	int x;
	int y;
public:
	Point() : x{ 0 }, y{ 0 } {}
	Point(int a, int b) : x{ a }, y{ b } {}
};

int main()
{
	Point p1(1, 2);	// ok

	// Point p2(1);	// error 
	Point p3(p1); 	// ok    
}

 

 

사용자가 복사 생성자를 제공하지 않으면
컴파일러가 디폴트 복사생성자 제공하며
멤버 데이터를 1:1로 대입하는 형태로 만들어진다.

// 복사 생성자 형태
Point p2(p1);
Point p2{p1};
Point p2 = p1;
Point p2 = {p1};

// 대입 형태
A::A(const A& ra)
{
    no = ra.no; 
    ch = ra.ch;
}

 

 

Q) 디폴트 생성자와는 어떤 차이가 있을까?

복사 생성자는 사용자가 「복사생성자」를 만들지 않으면 컴파일러가 제공해주는 반면

디폴트 생성자는 어떤 종류의 생성자도 만들지 않으면 컴파일러가 제공한다.

#include <iostream>

class Point
{
	int x, y;
public:
	Point(const Point& p) : x{ p.x }, y{ p.y }
	{
		std::cout << "복사 생성자" << std::endl;
	}
};

int main()
{
	Point p1; // error
	Point p2{ p1 };
}

 

복사 생성자가 있기 때문에 디폴트 생성자가 만들어지지 않는다.
그렇기에 p1 에서 Build Error 발생

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] default 생성자 요청  (2) 2025.02.05
[C++] default member initializer  (1) 2025.02.02
[C++] 클래스 파일 분할  (4) 2025.01.30
[C++] constexpr function  (1) 2025.01.29
[C++] member initializer list  (1) 2025.01.29

댓글