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

C++ 복사 생성자와 할당 연산자의 차이점 완벽 정리

C++에서 복사 생성자(Copy Constructor)할당 연산자(Assignment Operator)는 모두 한 객체를 다른 객체로 초기화하거나 대입할 때 사용됩니다. 그러나 두 가지의 핵심적인 차이가 존재합니다. 복사 생성자는 새로운 객체를 위해 별도의 메모리 블록을 생성하는 반면, 할당 연산자는 새로운 메모리 공간을 만들지 않고 참조 변수를 통해 기존 메모리 블록을 가리키게 됩니다.

복사 생성자 문법

classname (const classname &obj) {
   // 생성자 본문
}

할당 연산자 문법

classname Ob1, Ob2;
Ob2 = Ob1;

위 코드에서 Ob2 = Ob1;은 할당 연산자가 호출되는 경우이며, classname Ob2 = Ob1;처럼 선언과 동시에 초기화하는 경우에는 복사 생성자가 호출된다는 점을 기억해두면 좋습니다.

복사 생성자와 할당 연산자의 주요 차이점

복사 생성자할당 연산자
기본적으로 오버로드된 생성자입니다.기본적으로 연산자입니다.
이미 존재하는 객체를 사용하여 새로운 객체를 초기화합니다.이미 존재하는 두 객체 사이에서 한 객체의 값을 다른 객체에 대입합니다.
기존 객체를 기반으로 새 객체가 생성될 때 사용됩니다.기존 객체의 값을 다른 객체에 할당하고자 할 때 사용됩니다.
두 객체는 각각 서로 다른 메모리 위치를 사용합니다.하나의 메모리 위치를 사용하며, 서로 다른 참조 변수가 같은 위치를 가리킵니다.
클래스에 복사 생성자가 정의되어 있지 않으면 컴파일러가 자동으로 제공합니다.할당 연산자가 오버로드되지 않으면 비트 단위 복사(bitwise copy)가 수행됩니다.

예제 코드로 이해하기

다음 예제를 통해 두 가지가 실제로 언제 호출되는지 확인할 수 있습니다.

#include <iostream>
using namespace std;

class MyClass {
public:
    int value;

    MyClass(int v) : value(v) {}

    // 복사 생성자
    MyClass(const MyClass &obj) {
        value = obj.value;
        cout << "복사 생성자 호출" << endl;
    }
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1;   // 복사 생성자 호출 (새 객체 생성)

    MyClass obj3(20);
    obj3 = obj1;           // 할당 연산자 호출 (기존 객체에 대입)
    return 0;
}

정리하면, 새로운 객체가 탄생하는 순간이라면 복사 생성자가 호출되고, 이미 존재하는 객체에 값을 덮어쓰는 경우라면 할당 연산자가 호출됩니다. 특히 동적 메모리를 관리하는 클래스라면 깊은 복사(deep copy)를 위해 이 둘을 적절히 오버로드하는 것이 매우 중요합니다.