C++프로그래밍

2013.11.25 _ 연산자 오버로딩 연습 _

성엽이 2013. 11. 25. 15:59

연산자 오버로딩                          

: 연산자 오버로딩은 객체를 대상으로 산술연산, 관계연산, 논리연산을 재정의 하는 것이다.


함수반환형 operator 연산자(연산대상);


 연산자 오버로딩 ( = , + )

#include <iostream>

#include <string>
using  namespace  std;

class MYSTRING
{
  public:
    // 디폴트 생성자
    MYSTRING()
    {
      cpString = 0;
      uiLen = 0;
    }

    // 복사생성자
    MYSTRING(MYSTRING &r)
    {
      // 디폴트 생성자에서 받은 값을 다시 넣어줌
      uiLen = r.uiLen;
      // 클래스 안에 변수 cpString 에 동적할당
      cpString = new char[uiLen+1];
      memcpy(cpString, r.cpString , uiLen+1);
      
      cout << "복사 생성자 호출\n";
    }

    // 소멸자
    ~MYSTRING()
    {
      if0 != cpString )
      {
        delete [] cpString;
      }
    }

    // 인자가 하나인 생성자
    MYSTRING(const char *cpConString)
    {
      uiLen = strlen(cpConString);
      // 동적할당 
      cpString = new char[uiLen+1];
      memcpy(cpString, cpConString, uiLen+1);

      cout << "인자가 cpConString인 생성자\n" << endl;
    }

    // 출력 함수
    void Print()
    {
      if(0 != uiLen)
      {
        cout << cpString <<endl;
      }
      else
      {
        cout << "NULL\n";
      }
    }

    // 출력 함수
    void Print(ostream *o)
    {
      if(0 != uiLen)
      {
        *o << cpString;
      }
      else
      {
        *o << "NULL\n";
      }
    }

    MYSTRING& operator=(MYSTRING &r)
    {
      this->uiLen = r.uiLen;

      // 할당 받아서 가지고있던 문자열을 초기화 시켜주고 다시 받아야 
      // 문자열을 더할 때 문제가 없다
      if(0 != cpString)
      {
        delete [] cpString;
      }

      cpString = new char[uiLen+1];
      memcpy(cpString, r.cpString , uiLen+1);
      cout << "대입 연산자 호출\n";
    
      return *this;
    }

    friend MYSTRING operator+(MYSTRING &r1, MYSTRING &r2);
  
  private:
    unsigned int   uiLen;
    char *cpString;

};

// 앞의 인자 ( 출력(cout), 출력으로 할 문자열 )
ostream& operator<<(ostream &o, MYSTRING &r)
{
  // cout 의 주소를 인자로 
  r.Print(&o);

  return o;
}

MYSTRING operator+(MYSTRING &r1, MYSTRING &r2)
{
  // 디폴트 생성자 호출
  // 임시로 덧셈의 결과를 저장하기 위해 디폴트 생성자를 호출
  MYSTRING Tmp;  

  // 두개의 문자열을 합친 길이
  Tmp.uiLen = r1.uiLen + r2.uiLen;

  // Tmp.cpString 이 문자열을 가지고 있어야 하므로 동적할당
  Tmp.cpString = new char[Tmp.uiLen+1];

  // r1.cpString 을 Tmp.cpString 에 복사
  memcpy(Tmp.cpString, r1.cpString , r1.uiLen);
  // 더하고 난 다음에 위치를 옮겨주어야 하기 때문에 r1.uiLen 만큼 더한후에 
  // 그 위치에다가 r2.cpString 을 붙여넣어준다. 길이는 \0 문자 포함(+1)
  memcpy(Tmp.cpString+r1.uiLen, r2.cpString , r2.uiLen+1);
  
  cout << "덧셈 연산자 호출\n";

  // 소멸하기전에 임시생성자(복사생성자)를 호출해서 Tmp 를 저장 해둔다.
  return Tmp;
}

int main()
{

  MYSTRING Obj1;
  MYSTRING Obj2("하이");
  MYSTRING Obj3 = "예스";
  MYSTRING Obj4 = "NO";

  Obj1.Print();   // NULL
  Obj2.Print();   // 하이 
  Obj3.Print();   // 예스

  cout << Obj3 << endl;   // 예스

  Obj3.Print(&cout);      // 예스 
  cout << endl;

  cout << Obj3;           // 예스
  cout << endl;

  operator<<(cout, Obj4);// NO
  operator<<(cout, "\n");  
  operator<<(cout, "100");// 100
  operator<<(cout, "\n");

  cout << Obj1 << endl;    // NULL

  MYSTRING Obj5;           
  Obj5 = Obj2+Obj3;        // 하이예스 

  cout << Obj5 << endl;

  return 0;
}



 결과 사진

 : 출력하기 위한 " << " 연산자와 " + " 와 " = " 연산자를 이용해서 문자열을 더하는 함수를 따로 구현해 보았다.

   MYSTRING 클래스를 만들어 놓고 안에 Print() 함수 , operator= 함수 / 전역에 operator<< , operator+ 함수를 

   구현하여 문자열을 출력해 보았다.