C++ String
C++ String에 대해 정리한다.
ㆍSTR(Standard Template Library)
ㆍString Class 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*
String 클래스 정의
* 문자열을 저장할 배열을 동적할당(문자열의 크기가 일정하지 않으므로)
- 생성자
- 소멸자
- 복사생성자
- 대입연산자
* 문자열을 인자로 전달받는 생성자 정의
* 연산자 오버로딩
- +
- <<
- +=
- ==
: 객체가 지니는 문자열 포인터 값을 비교하는 것이 아님
: 포인터가 가리키는 문자열의 내용 비교
- >>
EX]=============================================================
int main(void){
string str1 = "Good ";
string str2 = "morning ";
string str3 = str1 + str2;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
str1 += str2;
if(str1==str3){
cout << "equal!" << endl;
}
string str4;
cout << "문자열 입력: ";
cin >> str4;
cout << "입력한 문자열: " << str4 << endl;
return 0;
}
OUTPUT]=========================================================
Good
morning
Good morning
equal!
문자열 입력: Hello!!
입력한 문자열: Hello!!
*/
#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
using std::cin;
using std::ostream;
using std::istream;
class String{
private:
char * str;
int lenght; // NULL 문자 포함하는 문자열의 길이
public:
String(); // 생성자
String(const char * _str); // 생성자(초기화)
~String(); // 소멸자
String(const String &_str); // 복사생성자
// 연산자 오버로딩 //
String& operator=(const String &_str);
String operator+(const String &_str);
String& operator+=(const String &_str);
bool operator==(const String &_str);
friend ostream& operator<<(ostream & os, String & _str);
friend istream& operator>>(istream & is, String & _str);
};
String::String(){
lenght = 0;
str = NULL;
}
String::String(const char * _str){
lenght = strlen(_str)+1;
str = new char[lenght];
strcpy(str, _str);
}
String::String(const String &_str){
lenght = _str.lenght;
str = new char[lenght];
strcpy(str, _str.str);
}
String::~String(){
if(str!=NULL)
delete [] str;
}
String& String::operator=(const String &_str){
if(str!=NULL)
delete [] str;
// default 대입연산자오버로딩 문제점 해결(메모리 누수 방지)
str = new char[_str.lenght];
strcpy(str, _str.str);
return *this;
// p1=p2=p3; 와 같은 연속적인 객체연산 가능하도록 this 반환
}
String String::operator+(const String &_str){
char * tempstr = new char[_str.lenght + lenght -1]; // str+str의 size - 1
strcpy(tempstr, str);
strcat(tempstr, _str.str);
String temp(tempstr);
delete [] tempstr;
return temp;
}
String& String::operator+=(const String &_str){
char * tempstr = new char[_str.lenght + lenght -1]; // str+str의 size - 1
strcpy(tempstr, str);
strcat(tempstr, _str.str);
if(str!=NULL)
delete [] str;
str=tempstr; // ??????
return *this;
}
bool String::operator==(const String &_str){
return strcmp(str, _str.str) ? false : true;
}
ostream& operator<<(ostream & os, String & _str){
os << _str.str;
return os;
}
istream& operator>>(istream & is, String & _str){
char tempstr[100]; // 100으로 한정?
is >> tempstr;
_str = String(tempstr);
return is;
}
int main(void){
String str1 = "Good ";
String str2 = "morning ";
String str3 = str1 + str2;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
str1 += str2;
if(str1==str3){
cout << "equal!" << endl;
}
String str4;
cout << "문자열 입력: ";
cin >> str4;
cout << "입력한 문자열: " << str4 << endl;
return 0;
}