728x90
string 클래스 디자인 목적: 문자열 처리 클래스를 직접 구현해봄으로써 연산자가 어떠한 형태로 오버로딩되어있는지 고민
1.표준 string 클래스의 분석
String클래스가 요구하는 것
1) 문자열을 인자로 전달받는 생성자의 정의
string str1 = "I like";
string str2 = "string class";
//위는 아래와 같다.
string str1("I like");
string str2("string class");
2)생성자, 소멸자, 복사 생성자 그리고 대입 연산자의 정의
저장하고자 하는 문자열의 길이가 일정치 않으므로 문자열 저장을 위한 메모리 공간을 생성자 내에서 동적할당 해야함.
3)결합된 문자열로 초기화된 객체를 반환하는 +연산자의 오버로딩
string str3 = str1+ str2;
4)문자열을 덧붙이는 += 연산자의 오버로딩
str1 += str2;
5) 내용비교를 진행하는 ==연산자의 오버로딩
6)콘솔입출력이 가능하도록 <<, >>연산자의 오버로딩
2.String클래스의 완성
#include <iostream>
#include <cstring>
using namespace std;
//StringClass.cpp의 String클래스 선언 부분
class String
{
private:
int len;
char *str;
public:
String();
String(const char* s);
String(const String& s);
~String();
String& operator=(const String& s);
String& operator+=(const String& s);
bool operator==(const String& s);
String operator+(const String& s);
friend ostream& operator<< (ostream& os, const String& s);
friend istream& operator>> (istream& os, String& s);
};
//StringClass.cpp의 멤버함수와 전역함수 정의 부분
String::String()
{
len = 0;
str = NULL;
}
String::String(const char* s)
{
len = strlen(s) + 1;
str =new char[len];
strcpy(str, s);
}
String::String(const String& s)
{
len = s.len;
str = new char[len];
strcpy(str, s.str);
}
String::~String()
{
if(str !=NULL)
delete []str;
}
String& String::operator=(const String &s)
{
if(str!=NULL)
delete []str;
len = s.len;
str = new char[len];
strcpy(str, s.str);
return *this;
}
String& String::operator+=(const String &s)
{
len+=(s.len - 1);
char* tempstr = new char[len];
strcpy(tempstr, str);
strcat(tempstr, s.str);
if(str!=NULL)
delete []str;
str = tempstr;
return *this;
}
bool String::operator==(const String& s)
{
return strcmp(str, s.str) ? false: true;
}
String String::operator+(const String& s)
{
char* tempstr = new char[len+s.len - 1];
strcpy(tempstr, str);
strcat(tempstr, s.str);
String temp(tempstr); // String temp = tempstr;
delete []tempstr;
return temp;
}
ostream& operator<<(ostream& os, const String& s)
{
os << s.str;
return os;
}
istream& operator>>(istream& is, String& s)
{
char str[100];
is >> str;
s = String(str);
return is;
}
int main(void)
{
String str1 = "I like ";
String str2 = "string class";
String str3 = str1 + str2;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
str1+= str2;
if(str1 == str3)
cout << "동일 문자열!" << endl;
else
cout << "동일하지 않은 문자열!" << endl;
String str4;
cout <<"문자열 입력: ";
cin >> str4;
cout << "입력한 문자열: " <<str4 << endl;
return 0;
}
728x90
'LANG > C++' 카테고리의 다른 글
[C++]13-2.클래스 템플릿(Class Template) (0) | 2023.05.26 |
---|---|
[C++]13-1.템플릿에 대한 이해와 함수 템플릿 (0) | 2023.05.26 |
[C++]12-1.C++의 표준과 표준 string 클래스 (0) | 2023.05.23 |
[C++]10-4.cout, cin 그리고 endl의 정체 (0) | 2023.05.18 |
[C++]10-3.교환법칙 문제의 해결 (0) | 2023.05.18 |