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' 탐색을 통해 길이를 계산하지 않아도 문자열의 끝을 알 수 있다.
'스터디 > C++' 카테고리의 다른 글
[ C++ ] 둘 이상의 자료형(Type)에 대한 템플릿 선언 (0) | 2019.11.29 |
---|---|
[ C++ ] 함수 템플릿(Function Template)과 템플릿 함수(Template Function) (1) | 2019.11.29 |
[ C++ ] 임시객체로의 자동 형 변환과 형 변환 연산자(Conversion Operator) (0) | 2019.11.28 |
[ C++ ] << 와 >> 연산자 오버로딩 예제 (0) | 2019.11.28 |
[ C++ ] 펑터(Functor), 함수 오브젝트(Function object) (0) | 2019.11.28 |