Programming/C++

16. 연산자 오버로드

KingSSSSS 2017. 12. 20. 10:22
class A
{
public:
       int mX ,mY;
       A() : mX (0) , mY(0 )
      {

      }
       // 우측항의변수는포인터대신참조자로넘긴다
       A operator +(const A &a )
      {
             A _a ;
             _a.mX = this-> mX + a .mX;
             _a.mY = this-> mY + a .mY;
             return _a ;
      }
}
int main ()
{
       A a1 (1, 2) , a2 (3, 4) , a3 ;
       a3 = a1 +a2;
       printf(" +  x = %d  y = %d\n" ,a3. mX,a3 .mY);
}

꼭 필요한 대입 연산자 오버로드

// 동적할당시
// 앝은복사때문에대입연산다재정의한다
// 복사생성자도재정의
Test& operator = (const Test& ref )
{
       // 메모리누수방지를위해해제를해준다
       free(name );
       // 메모리동적재할당
       name = (char *)calloc( strlen(ref .name)+ 1,sizeof (char));
       // 동적할당메모리에문자열복사
       strcpy(name ,ref. name);

       // this 는포인터이기때문에
       // *this 을써서this 참조자를반환한다
       return *this ;
}

클래스에 맴버 변수로 동적 할당을 한 변수가 있다면
복사생성자나 대입연산자를 반드시 오버로드를 하여
이유는 동적할당 된 변수의 메모리를 해제가 되기전에
복사생성자나 대입 연산 으로 인하여 얕은 복사가 일루어저서
동적할당된 변수를 서로 공유 할수 있기 때문이다

얕은 복사를 막는 방법은 복사생성자 함수 대입연산자 함수를
오보로드 하여 재정의를 하여 깊은 복사가 되게 하던가
아니면

private: 으로 빼서 아에 함수 호출을 막아버리면 된다