operator->() #
"->"의 연산자 겹지정은 포인터를 리턴으로 하는 형식을 취하고 있으며리턴되는 포인터의 "->" 연산자를 사용한 효과를 내는 특이한 특성을 가지고 있습니다.
#include <iostream> #include <string> using namespace std; template <class T> class SmartPtr { public: explicit SmartPtr(T *p = 0) : p_(p) {} virtual ~SmartPtr() { delete p_; } T* operator->() { return p_; } // 아래의 두개의 함수인 "!" 연산자 겹지정 함수와, // bool 타입으로의 변환연산자 함수는 융통성있는 인터페이스로 인하여 // 문제가 생길 여지가 있으므로 사전에 그것에 대해 알고 사용 하셔야 // 미래의 재앙에서 벗어날수 있습니다. ^^ bool operator!() { return p_ == null; } operator bool() { return p_ != NULL; } private: // 복사생성자와 대입연산자를 사용 못하게 하기위해 // private 멤버로 두었으며 구현을 하지 않았습니다. SmartPtr(const SmartPtr& sp); SmartPtr& operator=(const SmartPtr& sp); private: T *p_; }; int main() { SmartPtr<string> sp(new string("ABCDEFG")); // T* operator->() 함수가 호출됩니다. // 내부 string 객체의 length() 함수를 호출합니다. cout << sp->length() << endl; }
즉 main 함수의 코드 대로 라면 string* (stirng 타입의 template 이므로) 타입을 리턴하게 됩니다.
string의 멤버에 접근 가능하게 만들어 줍니다.
아마 다음과 같이 코드를 작성해야 될것입니다.
cout << sp->->length() << endl; // 혹은 cout << (sp->)->length() << endl; // 혹은 cout << (*(sp->)).length() << endl;
그러한 이유료 C++에서는 operator->() 함수 즉 "->" 연산자 겹지정 함수에 대해 그러한
능력이 부여된 것입니다.
ATL에서의 _com_ptr 객체 까지 두루두루 사용되고 있으며, 내부멤버를 접근을 제어를 위한
Proxy Pattern 같은 곳에서 유용하게 사용될 수 있는 기능입니다.
">>", "<<" 연산자 겹지정 #
">>" 혹은 "<<" 연산자는 비트단위의 Shift 연산을 하는 기능을 가지고 있는 연산자 입니다.당연히 ">>" 혹은 "<<" 연산자도 사용자 정의 타입인 클래스 객체에 대해 Shift 연산을 수행하는
코드를 생성할수도 있고, 또한 다른 기능을 사용자 정의에 의해 구현될 수 있습니다.
#include <iostream> using namespace std; int main() { cout << "Hello World" << endl; }
간단히 구현해 보자면 ...
#include <iostream> #include <string> #include <fstream> using namespace std; class Student { public: /* ... */ string strName_; int nID_; }; ostream& operator<<(ostream& os, const Student &st) { os << st.strName_ << " " << st.nID_; return os; } int main() { Student st; /* ... */ // 파일스트림으로 st의 내용을 보냅니다. ofstream fout("a.txt"); fout << st; // 표준 출력 스트림으로 st의 내용을 보냅니다. cout << st; }
ostream& operator<<(ostream& os, const Student &st)
그래야 다음과 같은 코드가 가능해 집니다.
fout << "VALUE: " << st << " END" << endl;
하지만 다음과 같은 문제점이 발생합니다.
class Student { public: /* ... */ Student& operator<<(ostream& os) { os << strName_ << " " << nID_; return *this; } string strName_; int nID_; }; int main() { Student st; /* ... */ ofstream fout("a.txt"); // 관습적이지 못한 인터페이스 입니다. // 사용하는 사람은 일관성 있는 인터페이스를 찾지못해 // 혼란에 빠질지도 모릅니다. st << fout; st << cout; }
(표준 라이브러리는 대부분 전역함수로 작성되어 있습니다.)
그러므로 다음과 같은 코드는 컴파일 에러 입니다.
// 사용자 정의 타입이 없습니다. oops~ double operator+(int n, double d) { return n + d; }
'Dev > C++' 카테고리의 다른 글
new 1 (0) | 2008.05.01 |
---|---|
initialization - array structure (0) | 2008.05.01 |
operator overloading 1 (0) | 2008.05.01 |
Conversion Functions - 변환함수 (0) | 2008.05.01 |
explicit (0) | 2008.05.01 |