C++ / / 2021. 7. 17. 00:12

[#11 열혈강의 C++]

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
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유