성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • 문자열 나누기
  • ARM Reverse Engineering
  • MFC
  • WINAPI
  • Boot Code 분석

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.11.25 _ 연산자 오버로딩 연습 _
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()
    {
      if( 0 != 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+ 함수를 

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


저작자표시 (새창열림)

'C++프로그래밍' 카테고리의 다른 글

[C] 2,3 차원 배열 과 포인터  (0) 2014.03.19
2013.11.22 _ 연산자 오버로딩 _  (0) 2013.11.22
2013.11.21 _ 상속에서 멤버 함수 재정의(함수오버로딩,함수오버라이딩)  (0) 2013.11.21
2013.11.20 _ 상속 예제 연습  (0) 2013.11.20
2013.11.14_ 상속(Inheritance) _ 예제 실습  (0) 2013.11.14
    'C++프로그래밍' 카테고리의 다른 글
    • [C] 2,3 차원 배열 과 포인터
    • 2013.11.22 _ 연산자 오버로딩 _
    • 2013.11.21 _ 상속에서 멤버 함수 재정의(함수오버로딩,함수오버라이딩)
    • 2013.11.20 _ 상속 예제 연습
    성엽이
    성엽이

    티스토리툴바