C++/Function

String 연산자 구현.

gandus 2010. 6. 20. 17:11

#include <iostream>

 

using std::endl;

using std::cout;

using std::cin;

 

using std::ostream;

using std::istream;

 

 

//////string 헤더 구현////////

class string{ //string객체 선언

int len; //길이

char* str; //멤버 변수

public:

string(const char* s=NULL); //생성자

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& is, string& s); //입력을 위한 연산자 오버로딩

};

 

string::string(const char* s){

len=(s!=NULL ? strlen(s)+1 : 1); // Null문자 계산하지 않으므로 +1

//Null이 아니면 s의 길이 +1, Null이면 1만큼 공간할당

str=new char[len]; //동적할당

 

if(s!=NULL) //Null이 아니면 복사

strcpy(str, s);

}

 

string::string(const string& s){ //깊은 복사 생성자

len=s.len;

str=new char[len];

strcpy(str, s.str);

}

 

string::~string(){ //소멸자. 위에서 +1된 메모리 공간

delete []str;

}

 

string& string::operator=(const string& s){ //깊은 복사 대입연산자. 리턴 타입은 참조

delete []str;

len=s.len;

str=new char[len];

strcpy(str, s.str);

return *this; //참조로 리턴해야 함

}

 

string& string::operator+=(const string& s){

len=len+s.len-1; //Null의 공간을 지운다.

char* tStr=new char[len]; //동적할당

strcpy(tStr, str); //복사

delete []str; //이전 공간을 제거

 

strcat(tStr, s.str); //s.str의 내용을 tstr뒤에 추가한다.

str=tStr; //다시 str에 초기화

return *this;

}

 

bool string::operator==(const string& s){ //문자열을 비교

return strcmp(str, s.str)? false:true; //문자열이 같으면 true, 다르면 false

}

 

string string::operator+(const string& s){ //문자열을 추가

char* tStr=new char[len+s.len-1];

strcpy(tStr, str); //문자열 복사

strcat(tStr, s.str); //문자열 추가

string temp(tStr);

delete []tStr;

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;

}

 

// main 함수는 StringClass1.cpp와 같다.

int main()

{

string str1="Good "; //str1 객체생성(good으로 초기화)

string str2="morning"; //str2 객체생성(morning으로 초기화)

string str3=str1+str2; //두 객체를 합쳐서 str3에 대입

 

cout<<str1<<endl; //출력

cout<<str2<<endl;

cout<<str3<<endl;

 

str1+=str2; //str1에 str2내용 추가

if(str1==str3) { //str1과 str3의 내용 비교.

cout<<"equal!"<<endl;

}

 

string str4; //객체 생성

cout<<"문자열 입력: ";

cin>>str4;

cout<<"입력한 문자열: "<<str4<<endl;

return 0;

}