Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 복사 생성자(Copy Constructor) 개념과 예제 완벽 정리

복사 생성자(Copy Constructor)는 생성자의 한 종류로, 같은 클래스의 기존 객체를 이용해 새로운 객체를 생성하고 초기화하는 역할을 합니다. 만약 클래스 내에 복사 생성자가 정의되어 있지 않다면, 컴파일러가 자동으로 기본 복사 생성자를 만들어 줍니다.

특히 포인터 변수나 동적 메모리 할당(dynamic memory allocation)을 사용하는 클래스에서는 얕은 복사(shallow copy)로 인한 문제(예: 이중 해제, 댕글링 포인터 등)를 방지하기 위해 복사 생성자를 직접 정의하는 것이 필수적입니다.

복사 생성자 예제 코드

다음 프로그램은 복사 생성자의 동작 방식을 보여줍니다.

#include<iostream>
using namespace std;
class Demo {
    private:
    int num1, num2;
    public:
    Demo(int n1, int n2) {
        num1 = n1;
        num2 = n2;
    }
    Demo(const Demo &n) {
        num1 = n.num1;
        num2 = n.num2;
    }
    void display() {
        cout<<"num1 = "<< num1 <<endl;
        cout<<"num2 = "<< num2 <<endl;
    }
};
int main() {
    Demo obj1(10, 20);
    Demo obj2 = obj1;
    obj1.display();
    obj2.display();
    return 0;
}

실행 결과

num1 = 10
num2 = 20

num1 = 10
num2 = 20

코드 분석

위 프로그램의 Demo 클래스는 일반적인 매개변수 생성자와 복사 생성자를 함께 가지고 있습니다. 또한 num1num2 값을 화면에 출력하는 display() 함수도 포함되어 있습니다.

class Demo {
    private:
    int num1, num2;
    public:
    Demo(int n1, int n2) {
        num1 = n1;
        num2 = n2;
    }
    Demo(const Demo &n) {
        num1 = n.num1;
        num2 = n.num2;
    }
    void display() {
        cout<<"num1 = "<< num1 <<endl;
        cout<<"num2 = "<< num2 <<endl;
    }
};

main() 함수의 동작 흐름

main() 함수에서는 먼저 매개변수 생성자를 사용하여 객체 obj1을 초기화합니다. 그다음 Demo obj2 = obj1; 구문이 실행되면서 복사 생성자가 호출되고, obj1의 값들이 obj2로 복사됩니다. 마지막으로 두 객체의 값을 출력하여 결과를 확인할 수 있습니다.

Demo obj1(10, 20);
Demo obj2 = obj1;
obj1.display();
obj2.display();

정리

복사 생성자는 객체 간 복사가 발생하는 시점(객체 초기화, 함수에 객체를 값으로 전달, 함수에서 객체를 값으로 반환)에 자동으로 호출됩니다. 기본 복사 생성자는 멤버 변수를 단순히 하나씩 복사하는 얕은 복사를 수행하므로, 동적 메모리를 다루는 클래스라면 깊은 복사(deep copy)를 수행하는 복사 생성자를 직접 작성하는 것이 안전합니다.