jam 블로그

[C++] 011. string 클래스 디자인 본문

개발 및 관련 자료/C

[C++] 011. string 클래스 디자인

kid1412 2013. 5. 12. 20:17
728x90

I. C++ 표준 라이브러리

  • 책을 읽어보시오

 

II. 표준 string 클래스

  1.  #include <iostream>
    #include <string>
    using namespace std;
  2. int main()
    {
     string str1 = "Good";
     string str2 = "morning";
     string str3 = str1+str2;
  3.  cout<<str1<<endl;
     cout<<str2<<endl;
     cout<<str3<<endl;
  4.  str1 += str2;
  5.  if (str1==str3)
     {
      cout<<"equal!"<<endl;
     }
     string str4;
     cout<<"문자열 입력 : ";
     cin>>str4;
     cout<<"입력한 문자열 : "<<str4<<endl;
     return 0;
    }
  •  예시이다.

 

III. 사용자 정의 string 클래스

  • 구현해야 할 string 클래스의 특징이다.

    • 첫번째, 생성자, 소멸자, 복사 생성자 그리고 대입 연산자를 정의해야한다.
    • 둘째, 문자열을 인자로 전달받는 생성자를 정의해야 한다.
    • 셋째, + 연산자를 오버로딩해야 한다.
    • 넷째 <<연산자를 오버로딩해야한다.
    • 다섯째 +=연산자를 오버로딩해야한다.
    • 여섯째 내용 비교를 하도록 == 연산자를 오버로딩해야한다.
    • 일곱째 >> 연산자를 오버로딩해야한다.
  1. #include <iostream>
  2. using std::cout;
    using std::ostream;
    using std::istream;
    using std::endl;
  3. class string
    {
     int len;
     char* str;
    public:
     string(const char* s=NULL);
     string(const string& s);
     ~string(){}
  4.  string& operator=(const string& s);
     string& operator+=(const string& s);
     bool operator==(const string& s);
     string operator+(const string& s);
  5.  friend ostream& operator>>(ostream& os, const string& s);
     friend istream& operator<<(istream& is, string & s);
    };
  • 첫째인 생성자, 소멸자, 복사 생성자, 대입 연산자의 정의에 대한 것이다.
  1. string::string(const char *s)
    {
     len=(s!=NULL?strlen(s)+1:1);
     str = new char[len];
  2.  if(s!=NULL)
     {
      strcpy(str,s);
     }
    }
  • string 클래스에 필요로 하는 생성자이다.
  1. string::string(const string &s)
    {
     len=s.len;
     str=new char[len];
     strcpy(str,s.str);
    }
  2. string::~string()
    {
     delete []str;
    }
  • 위의 소스는 소멸자와 깊은 복사를 하는 복사 생성자 정의이다.
  1. string& string::operator =(const string &s)
    {
     delete []str;
     len=s.len;
     str = new char[len];
     strcpy(str,s.str);
     return *this;
    }
  • 위의 소스는 대입연산자 정의이다.
  1. string string::operator +(const string &s)
    {
     char* tStr=new char[len+s.len-1];
     strcpy(tStr,str);
     strcat(tStr,s.str);
  2.  string temp(tStr);
     delete []tStr;
     return temp;
    }
  •  operator+에 대한 연산자의 오버로딩이다.
  1. ostream& operator<<(ostream& os, const string& s)
    {
     os<<s.str;
     return os;
    }
  • 문자열을 출력할수 있도록 <<연산자를 오버로딩 한것이다.
  1. string& string::operator +=(const string &s)
    {
     len = len+s.len-1;
     char* tStr=new char[len];
     strcpy(tStr,str);
     delete []str;
  2.  strcat(tStr,s.str);
     str=tStr;
     return *this;
    }
  • operator += 연산자의 오버로딩이다.
  1.  bool string::operator ==(const string &s)
    {
     return strcmp(str,s.str)? false:true;
    }
  • 내용을 비교하는 ==연산자 오버로딩이다.
  1. istream& operator>>(istream& is,string& s)
    {
     char str[100];
     is>>str;
  2.  s=string(str);
     return is;
    }
  • >>연산자의 오버로딩이다.
  1. #include <iostream>
  2. using std::cout;
    using std::ostream;
    using std::istream;
    using std::endl;

  3. class string
    {
     int len;
     char* str;
    public:
     string(const char* s=NULL);
     string(const string& s);
     ~string();
  4.  string& operator=(const string& s);
     string& operator+=(const string& s);
     bool operator==(const string& s);
     string operator+(const string& s);
  5.  friend ostream& operator<<(ostream& os, const string& s);
     friend istream& operator>>(istream& is, string & s);
    };
    string::string(const char *s)
    {
     len=(s!=NULL?strlen(s)+1:1);
     str = new char[len];
  6.  if(s!=NULL)
     {
      strcpy(str,s);
     }
    }
    string::string(const string &s)
    {
     len=s.len;
     str=new char[len];
     strcpy(str,s.str);
    }
  7. string::~string()
    {
     delete []str;
    }
    string& string::operator =(const string &s)
    {
     delete []str;
     len=s.len;
     str = new char[len];
     strcpy(str,s.str);
     return *this;
    }
    string string::operator +(const string &s)
    {
     char* tStr=new char[len+s.len-1];
     strcpy(tStr,str);
     strcat(tStr,s.str);
  8.  string temp(tStr);
     delete []tStr;
     return temp;
    }
    ostream& operator<<(ostream& os, const string& s)
    {
     os<<s.str;
     return os;
    }
    string& string::operator +=(const string &s)
    {
     len = len+s.len-1;
     char* tStr=new char[len];
     strcpy(tStr,str);
     delete []str;
  9.  strcat(tStr,s.str);
     str=tStr;
     return *this;
    }
    bool string::operator ==(const string &s)
    {
     return strcmp(str,s.str)? false:true;
    }
    istream& operator>>(istream& is,string& s)
    {
     char str[100];
     is>>str;
  10.  s=string(str);
     return is;
    }
    int main()
    {
     string str1 = "hello world";
  11.  cout<<str1<<endl;
     return 0;
    }
  • 여지껏 만든 것이 string헤더에 있는 string과 같은 역할을 하는 것을 만들어 보았다.
Comments