본문 바로가기

C,C++/공부 낙서

공부하면서 빠트린 것들 끄적끄적 - 연산자

int main() {
    Test a;			//생성자 호출
    Test b(a);		//복사생성자 호출
    Test c = a;		//복사생성자 호출
    a = b;			//복사대입연산자 호출
     
    return 0;
}

 

클래스를 만들 때 복사 생성자 및 복사대입 연산자는 따로 만들어주는 것이 좋습니다.

 

만약 그렇지 않을 경우 C++에서는  c = a; 같은 코드를 보면 얕은 복사를 실행하게 되는데 이렇게 되면 해당 클래스 c와 a의 포인터 멤버 변수가 있을 경우 같은 객체를 가리키게 됩니다.

이렇게 했을 때 c 또는 a의 클래스에서 포인터 멤버 변수가 가리키고 있는 객체를 삭제하게 되면

나머지 클래스의 포인터 멤버 변수는 존재하지 않는 객체를 가리키게 되는 문제가 발생합니다.

 

따라서 직접 복사 생성자 및 복사대입 연산자를 정의해줘야합니다.

 

얕은 복사 : 서로 같은 주소값으로 복사합니다.

깊은 복사 : 각각의 고유 주소값을 가지면서 복사합니다.