본문 바로가기
C++

배열의 인덱스 연산자 오버로딩

by 상레알 2009. 2. 10.

이번에 오버로딩 할것은 배열의 요소에 접근할 때 사용되는 [] 연산자이다. 이는 다른 연산자들과 달리 피연산자가 연산자 안으로 들어가게 된다.(예: arr[10]).

arr[i]   = > arr.operator[](i) 

객체를 저장할 수 있는 배열 클래스를 정의 할 수 도 있 다!



     ++++++  대입 연산자의 오버로딩  ++++++

A a =b ;   -->   A a(b)    => 복사 생성자 +_+

A a;
A b;
a=b;   ->   a(b)   ==> 이런건 존재하지 않는다 -_-
복사생성자는 객체 생성시에 하는것이 복사생성자이다 대입연산이 이루어진게 같기는 하나 전혀 다른 의미이다!

a.operator=(b)  => 요러코롬 해석이 됨...ㅋㅋ

오버로딩된 대입 연산자를 제공하지 않으면, 디폴트 대입 연산자가 제공된다. 이러한 디폴트 대입 연산자는 복사 생성자와 마찬가지로 멤버 변수 대 멤버 변수를 복사하는 기능을 지닌다.
[디폴트 대입 연산자  ]
ex )
Point& Point::operator=(const Point& p)
{
x=p.x;
y=p.y;
return *this;
}
리턴 타입이 Point& 형이고, 자기 자신을 리턴하는 이유는    p1=p2=p3 ;  이러한 연산을 허용하기 위해서이다.
만약에 리턴타입이 void 형이라면 p1=p2=p3;  이러한 연산은 에러가 발생한다.
- 디폴트 대입 연산자는 얕은 복사를 한다...   멤버대 멤버 복사..

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

문제점은...디폴트 복사 생성자가 지니고 있는 문제점과 개념적으로 일치한다. 거기에다가 메모리 유출..현상도 발생한다.
즉... 첫번째 문제점은 얕은 복사에 있다. 디폴트 대입 연산자는 얕은 복사를 진행하기 때문에 char* 타입같은경우  포인터 값만 복사하여 가리키는것만 바뀐다. 따라서 객체가 소멸되는 시점에 각각 소멸자를 호출하는대. 복사된것은 두번삭제되며
복사하기전에 가리키던것은
두번째 문제점으로 메모리 유출이 된다..그리고 그 것을 가리키는 대상이 없어졌기 때문에 더이상 접근할수도 없다.

참고 +_+   객체는 stack 영역  char* 문자열은 힙 영역....이해가 안된다면..10_7 대입연산자 오버로딩 동영상강의 참고

깊은 복사를 하는 대입 연산자의 예
Person& Person::operator=(const Person& p)
{
delet []name;
name=new char[strlen(p.name)+1];
strcpy(name,p.name);
return *this;
}

대입 연ㅅ나자와 복사 생성자의 정의 형태는 대부분의 프로그래머가 일치한다.(배열 클래스의 경우는 예외) 이 두 함수의 경우, 그목적이 이미 정해져 있기 때문이다.

 * 생성자 내에서 메모리 공간을 동적 할당하게 되면, 할당된 메모리를 해체하는 용도의 소멸자를 정의해야 하면
   더불어서 복사 생성자와 대입 연산자도 깊은 복사를 하도록 정의해야된다.