본문 바로가기
스터디/C++

[ C++ ] 대입 연산자 오버로딩

by 알 수 없는 사용자 2019. 10. 11.

대입 연산자 오버 로딩을 하지 않으면 기본적으로 디폴트 대입 연산자가 생긴다.

 

그전에 대입 연산자의 오버 로딩이랑 복사 생성자와 비슷하기 때문에 복사 생성자 특징을 다시 살펴보면

 

- 정의하지 않으면 디폴트 복사 생성자가 생긴다.

- 디폴트 복사 생성자는 얕은 복사를 한다.

- 생성자 내에서 동적 할당을 하거나 깊은 복사가 필요하면 직접 정의를 해야 한다.

 

그리고 대입 연산자의 오버로딩 특징

 

- 정의하지 않으면 디폴트 대입 연산자가 생긴다.

- 디폴트 대입 연산자는 얕은 복사를 한다.

- 연산자 내에서 동적 할당을 하거나 깊은 복사가 필요하면 직접 정의를 해야 한다.

 

둘은 유사하지만 호출되는 시점이 다르다.

 

복사 생성자의 경우에는

이렇게 호출하지만 대입 연산자 오버 로딩은

 

이렇게 호출한다.

 

즉, 복사 생성자는 객체가 새로 생성되는 시점에서 대입을 할 때 호출이 되고

대입 연산자는 객체 두 개가 이미 생성 및 초기 화이 진행된 상태에서 대입을 할 때 호출이 된다.

 

 

그리도 대입 연산자의 주의할 점이 있다면,

 

연산자 내에 동적 할당이 된 경우에는 이전에 동적 할당되었던 데이터를 해제해야 한다.

 

24행과 같이 이전에 있던 데이터를 해제해줘야 한다.

 

만약 24행에서 데이터를 해제하지 않으면 어떤 경우가 생길까?

 

일단 순서대로 살펴보자.

객체 a는 문자열 "aaa"를 포인터 참조하고 있고,

객체 b는 문자열 "bbb"를 포인터 참조하고 있다.

그리고 a = b를 통해 a.operator=(b)로 표현이 되어 대입 연산자가 호출되고 있다.

data는 문자열 "bbb"에 맞게 새로 공간이 할당되고 문자열 "bbb"를 포인터 참조하게 된다.

그럼 기존에 있던 문자열 "aaa"는 어떻게 될까?

 

프로그램이 종료될 때 a와 b의 소멸자가 호출되어 delete [] name을 통해 문자열 "bbb"를 소멸시키지만,

기존에 있던 문자열 "aaa"가 소멸이 되지 않아 메모리 누수 문제가 생긴다.

 

대입 연산자 오버 로딩을 통해 기존에 있던 문자열을 해제하고 데이터를 새로 할당을 해야 한다.

 

그리고 또 주의할 점이 있다.

 

바로 상속 구조에서의 대입 연산자인데, 다음 예제를 보자.

다음 예제를 보면 cpy의 num1이 변경되지 않을 것을 확인할 수 있다.

즉, 대입 연산자는 생성자가 아니기 때문에 클래스 B의 대입 연산자를 사용할 때 A 클래스의 대입 연산자 호출을 해야 한다.

 

대입 연산자를 호출하는 방법은 

A::operator=(ref);

이렇게 하면 된다. 그럼 다시 실행결과를 보자.

클래스 A와 B의 대입 연산자 두 개가 호출된 것을 확인할 수 있다.