본문 바로가기
스터디/C++

[ C++ ] String 클래스

by 알 수 없는 사용자 2019. 11. 28.

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' 탐색을 통해 길이를 계산하지 않아도 문자열의 끝을 알 수 있다.