대입 연산자의 특징
- 정의하지 않으면 디폴트 대입 연산자가 삽입된다.
- 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.
- 연산자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.
*객체간의 대입연산은 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
'Software Development > C, C++' 카테고리의 다른 글
[C++]new, delete 연산자 오버로딩 (0) | 2019.01.13 |
---|---|
[C++] 배열 인덱스 연산자 오버로딩 [] (1) | 2019.01.12 |
[C++] 단항 연산자 오버로딩 (0) | 2019.01.03 |
[C++] 연산자 오버로딩 (0) | 2019.01.03 |
[C++] 가상 상속 (Virtual Inheritance) (0) | 2019.01.02 |