2021-07-13
[Chapter 11] 연산자 오버로딩2
대입 연산자의 오버로딩
1. 정의하지 않으면 디폴트 대입 연산자.
2. 디폴트 대입 연산자는 멤버 : 멤버의 복사이다. // 소멸의 과정에서 문제가된다.
3. 연산자 내에서 동적 할당을 한다면, 깊은 복사가 필요하다면 직접 정의가 필요하다.
복사생성자와의 차이점은 호출 시기이다.
복사 생성자가 호출되는 대표적 상황 :
Point pos1(5,7);
Point pos2 = pos1; // pos2의 초기화에 기존 객체 pos1이 사용됨
대입 연산자가 호출되는 대표적인 상황 :
Point pos1 (5,7);
Point pos2 (9,10);
pos2 = pos1; //pos2 pos1 모두 이미 초기화된 객체.
=> pos2.operator= (pos1) ;
대입 연산자의 깊은 복사
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; }
상속 구조에서 대입 연산자 호출 : 유도 클래스의 대입 연산자는 명시가 없을 경우 기초 클래스의 대입 연산자 호출 x
-> 유도클래스의 대입 연산자에서, 기초클래스의 대입연산자를 호출 해줘야 한다.
배열의 인덱스 연산자 [ ] 오버로딩
int operator [ ] (int idx){ }
arrObject[2] -> arrObject . operator[ ] (2);
객체의 저장을 위한 배열 클래스의 정의
1. Point 객체의 주소 값을 저장하는 배열 기반의 클래스
2. Point 객체를 저장하는 배열 기반의 클래스
1 ->
Point * arr;
Point& operator [ ] (int idx){
return arr[idx]; }
Point operator [] (int idx) const {
return arr[idx]; } //얕은 복사
2 ->
typdedf Point * POINT_PTR;
POINT_PTR * arr;
POINT_PTR & operator [ ] ( int idx) {
return arr[idx] ; }
POINT_PTR operator[] (int idx) const [
return arr[idx] ; } //깊은 복사
'C++' 카테고리의 다른 글
[#13 열혈강의 C++] (0) | 2021.07.24 |
---|---|
[#12 열혈강의 C++] (0) | 2021.07.23 |
[#10 열혈강의 C++] (0) | 2021.07.13 |
[#9 열혈강의 C++] (0) | 2021.07.13 |
[#8 열혈강의 C++] (0) | 2021.07.08 |