스터디/C++
[ C++ ] String 클래스
알 수 없는 사용자
2019. 11. 28. 20:17
String 클래스 선언 및 정의해보기.
구현할 사항은
1. 문자열을 인자로 전달받는 생성자의 정의
2. 생성자, 소멸자, 복사 생성자 그리고 대입 연산자의 정의
3. 결합된 문자열로 초기화된 객체를 반환하는 +연산자의 오버 로딩
4. 문자열을 덧붙이는 += 연산자의 오버 로딩
5. 값 비교를 진행하는 == 연산자의 오버 로딩
6. 콘솔 입출력이 가능하도록 <<, >> 연산자의 오버 로딩
#include <iostream>
#include <cstring>
using namespace std;
class String
{
private:
int len;
char * str;
public:
String();
String(const char * _str);
String(const String& _str);
~String();
String& operator= (const String& _str);
String& operator+= (const String& _str);
bool operator== (const String& _str);
String operator+(const String& _str);
friend ostream& operator<< (ostream& os, const String& _str);
friend istream& operator>> (istream& is, String& _str);
};
int main(void) {
String str1 = "Hello ";
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;
cin >> str4;
cout << str4;
return 0;
}
String::String()
{
len = 0;
str = NULL;
}
String::String(const char * _str)
{
len = strlen(_str) + 1;
str = new char[len];
strcpy(str, _str);
}
String::String(const String& _str)
{
len = _str.len;
str = new char[len];
strcpy(str, _str.str);
}
String::~String()
{
if (str != NULL)
delete []str;
}
String& String::operator= (const String& _str)
{
if (str != NULL)
delete []str;
len = _str.len;
str = new char[len];
strcpy(str, _str.str);
return *this;
}
String& String::operator+= (const String& _str)
{
char* temp = new char[len + _str.len - 1];
strcpy(temp, str);
strcat(temp, _str.str);
if (str != NULL)
delete[]str;
str = temp;
return *this;
}
bool String::operator== (const String& _str)
{
return strcmp(str, _str.str) ? false : true;
}
String String::operator+ (const String& _str)
{
char * temp = new char[len + _str.len - 1];
strcpy(temp, str);
strcat(temp, _str.str);
String result(temp);
delete[]temp;
return result;
}
ostream& operator<< (ostream& os, const String& _str)
{
os << _str.str;
return os;
}
istream& operator>> (istream& is, String& _str)
{
char str[100];
is >> str;
_str = String(str);
return is;
}
실행 결과
추가로 알아야 할 점은
실제 std::string도 문자열을 메모리에 저장할 때 실제론 '\0'을 포함하지만 개념상 \0\0에 대한 접근을 허용하지 않는다. 또한 문자열의 길이를 이미 갖고 있기 때문에 '\0' 탐색을 통해 길이를 계산하지 않아도 문자열의 끝을 알 수 있다.