개발/C, C++

[C++] 연산자 오버로딩 - 디폴트 대입 연산자

huiyu 2019. 1. 12. 10:21

대입 연산자의 특징

 - 정의하지 않으면 디폴트 대입 연산자가 삽입된다.
 - 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.
 - 연산자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.

*객체간의 대입연산은 C언어의 구조체 변수간의 대입연산과는 본질적으로 다르다.
 이는 단순한 대입연산이 아닌, 대입 연산자를 오버로딩 한 함수의 호출이기 때문이다.


디폴트 대입 연산자의 문제점

- 디폴트 복사 생성자의 문제점과 유사하다. 디폴트 대입 연산자는 멤버 대 멤버를 단순히 복사만 하게 된다.

-> 깊은 복사를 진행하도록 정의, 메모리 누수가 발생하지 않도록, 깊은 복사에 앞서 메모리 해제의 과정을 거친다.

1
2
3
4
5
6
7
8
9
Person& operator=(const Person& ref)
{
  delete []name;  // 메모리 누수를 막기 위한 메모리 해제 연산
  int len = strlen(ref.name) + 1;
  name = new char[len];
  strcpy(name, ref.name);
  age = ref.age;
  return *this;
}
cs


**상속 구조에서의 대입 연산자 호출

 - 자식 클래스의 생성자에는 아무런 명시를 하지 않아도 부모 클래스의 생성자가 호출,
 그러나 자식 클래스의 대입 연산자에는 아무런 명시를 하지 않으면, 부모 클래스의 대입 연산자가 호출되지 않는다.

-> 때문에 자식클래스의 대입 연산자를 정의해야 하는 상황에 놓이면, 부모 클래스의 대입 연산자를 명시적으로 호출하여야 한다.

1
2
3
4
5
6
7
Second& operator=(const Second& ref)
{
  First::operator=(ref); // 부모 클래스의 대입 연산자 호출
  num3 = ref.num3;
  num4 = ref.num4;
  return *this;
}
cs


[참고자료]
윤성우 열혈 C++ 프로그래밍 11-1 반드시 해야 하는 대입 연산자의 오버로딩

728x90
반응형