[C++] 복사 생성자

dd_ddong·2022년 7월 18일
0

c++

목록 보기
19/38

객체의 대입연산

int a = b;
기본자료형에서의 대입연산은 간단하다. 오른쪽에 저장된 값을 왼쪽변수의 메모리에 그대로 복사하면 끝이다.

Person per2 = per1;
그러나 다음과 같은 사용자가 정의한 class의 대입연산의 경우 그 구조가 복잡하기 때문에 대입연산의 경우의 수가 매우 많고 어떻게 처리할지 모호해진다.

그렇기 때문에,
c++에서는 우리가 정의한 class에 대한 대입연산은 스스로 정의를 해야한다.
즉, 우리가 정의한 대로 대입연산의 결과가 달라진다.

c++에서의 변수 초기화

  1. int a = b;
  2. int a;
    a = b;

여기서 1번과 2번은 대입연산이 일어나는 과정이 엄연히 다르다.
1번의 경우 -> 생성과 동시에 다른 객체로 대입(초기화)하는 경우
2변의 경우 -> 이미 생성된 객체간의 대입연산

1번의 경우

c++에서의 대입연산은 묵시적으로 다음과 같은 과정을 거친다.
int a= b; ==>> int a(b)
int &ref = a; ==>> int &ref(a);
Person per2 = per1; ==>> Person per2(per1);
기본 자료형이든 class든 생성자 호출의 형태로 변형된다.

2번의 경우

나중에 연산자 오버로딩에서 배운다...

복사 생성자

c++에서 초기화가 생성자 호출로 묵시적 변환이 된다는 것은 알았다.
이렇게 같은 타입의 객체를 매개변수로 받는 생성자를 복사 생성자라고 한다.
하지만 그런 생성자를 선언하지 않았는데 어떻게 호출할까?

1. 디폴트 복사생성자

class 생성한다면 디폴트 생성자가 자동으로 생성되는 것 + 디폴트 복사생성자가 생성된다.

class Person
{
private:
	char *name;
    int age;
 public:
 	Person(const Person &ref) //defult 복사생성자의 형태
    {
    	name = ref.name;
        age = ref.age;
    }
}

위에서 정의한 형태의 디폴트 복사생성자가 다른 생성자가 얼마나 있든 복사생성자가 없다면 자동삽입 된다.

디폴트 복사 생성자의 경우 멤버변수들의 복사가 이뤄진다.

사용자 정의 복사생성자

ClassName(const ClassName &ref) { //사용자 정의 }
위와 같은 형태로 복사생성자를 선언할 수 있고 함수 몸체에 정의한대로 대입연산이 처리된다 볼 수 있다.

키워드 explicit

Person per2 = per1; ==>> Person per2(per1);
위와 같은 묵시적 형변환을 막는 키워드가 explicit이다.
Person per2 = per1;같은 선언이 불가능해진다.

복사생성자 뿐만 아니라 생성자에도 적용할 수 있다.

class AAA
{
	int a;
public:
	AAA(int n) : a(n) { }
};

위와 같은 AAA class가 있다고 하면
AAA a = 3 으로 초기화 할 수 있다. (AAA a(3)으로 묵시적 변환이 이뤄지므로)
하지만 explicit AAA(int n) : a(n) {}으로 생성자를 변경하면 위와 같은 선언은 불가하다.

0개의 댓글