연산자 오버로딩
: 연산자 오버로딩은 객체를 대상으로 산술연산, 관계연산, 논리연산을 재정의 하는 것이다.
함수반환형 operator 연산자(연산대상);
연산자 오버로딩 ( = , + ) |
#include <iostream> #include <string> using namespace std;
class MYSTRING { public: // 디폴트 생성자 MYSTRING() { cpString = 0; uiLen = 0; }
// 복사생성자 MYSTRING(MYSTRING &r) { // 디폴트 생성자에서 받은 값을 다시 넣어줌 uiLen = r.uiLen; // 클래스 안에 변수 cpString 에 동적할당 cpString = new char[uiLen+1]; memcpy(cpString, r.cpString , uiLen+1); cout << "복사 생성자 호출\n"; }
// 소멸자 ~MYSTRING() { if( 0 != cpString ) { delete [] cpString; } }
// 인자가 하나인 생성자 MYSTRING(const char *cpConString) { uiLen = strlen(cpConString); // 동적할당 cpString = new char[uiLen+1]; memcpy(cpString, cpConString, uiLen+1);
cout << "인자가 cpConString인 생성자\n" << endl; }
// 출력 함수 void Print() { if(0 != uiLen) { cout << cpString <<endl; } else { cout << "NULL\n"; } }
// 출력 함수 void Print(ostream *o) { if(0 != uiLen) { *o << cpString; } else { *o << "NULL\n"; } }
MYSTRING& operator=(MYSTRING &r) { this->uiLen = r.uiLen;
// 할당 받아서 가지고있던 문자열을 초기화 시켜주고 다시 받아야 // 문자열을 더할 때 문제가 없다 if(0 != cpString) { delete [] cpString; }
cpString = new char[uiLen+1]; memcpy(cpString, r.cpString , uiLen+1); cout << "대입 연산자 호출\n"; return *this; }
friend MYSTRING operator+(MYSTRING &r1, MYSTRING &r2); private: unsigned int uiLen; char *cpString;
};
// 앞의 인자 ( 출력(cout), 출력으로 할 문자열 ) ostream& operator<<(ostream &o, MYSTRING &r) { // cout 의 주소를 인자로 r.Print(&o);
return o; }
MYSTRING operator+(MYSTRING &r1, MYSTRING &r2) { // 디폴트 생성자 호출 // 임시로 덧셈의 결과를 저장하기 위해 디폴트 생성자를 호출 MYSTRING Tmp;
// 두개의 문자열을 합친 길이 Tmp.uiLen = r1.uiLen + r2.uiLen;
// Tmp.cpString 이 문자열을 가지고 있어야 하므로 동적할당 Tmp.cpString = new char[Tmp.uiLen+1];
// r1.cpString 을 Tmp.cpString 에 복사 memcpy(Tmp.cpString, r1.cpString , r1.uiLen); // 더하고 난 다음에 위치를 옮겨주어야 하기 때문에 r1.uiLen 만큼 더한후에 // 그 위치에다가 r2.cpString 을 붙여넣어준다. 길이는 \0 문자 포함(+1) memcpy(Tmp.cpString+r1.uiLen, r2.cpString , r2.uiLen+1); cout << "덧셈 연산자 호출\n";
// 소멸하기전에 임시생성자(복사생성자)를 호출해서 Tmp 를 저장 해둔다. return Tmp; }
int main() {
MYSTRING Obj1; MYSTRING Obj2("하이"); MYSTRING Obj3 = "예스"; MYSTRING Obj4 = "NO";
Obj1.Print(); // NULL Obj2.Print(); // 하이 Obj3.Print(); // 예스
cout << Obj3 << endl; // 예스
Obj3.Print(&cout); // 예스 cout << endl;
cout << Obj3; // 예스 cout << endl;
operator<<(cout, Obj4);// NO operator<<(cout, "\n"); operator<<(cout, "100");// 100 operator<<(cout, "\n");
cout << Obj1 << endl; // NULL
MYSTRING Obj5; Obj5 = Obj2+Obj3; // 하이예스
cout << Obj5 << endl;
return 0; } |
결과 사진 |
: 출력하기 위한 " << " 연산자와 " + " 와 " = " 연산자를 이용해서 문자열을 더하는 함수를 따로 구현해 보았다. MYSTRING 클래스를 만들어 놓고 안에 Print() 함수 , operator= 함수 / 전역에 operator<< , operator+ 함수를 구현하여 문자열을 출력해 보았다. |