-
스마트 포인터와 ->, *연산자 오버로딩@ 16. 1 ~ 17. 1/C++ 2013. 5. 21. 22:55
일반 포인터를 사용 후 delete를 호출하지 않으면 메모리가 누수가 발생하여 프로그램에 심각한 문제를 발생
그래서 쉽게 하기 위한 스마트 포인터가 등장!
class Point{ int x; int y; public: Point(int _x=0, int _y=0) : x(_x), y(_y){} void Print() const{ cout << x << ',' << y << endl; } }; class PointPtr{ Point *ptr; public: PointPtr(Point *p) : ptr(p) {} ~PointPtr(){ delete ptr; } Point* operator->() const{ return ptr; } Point& operator*() const{ return *ptr; } }; int main() { PointPtr p1=new Point(1,2); PointPtr p2=new Point(3,4); p1->Print(); (*p1).Print(); getch(); return 0; }
Pointptr 클래스의 소멸자를 이용하여 동적으로 할당된 Point객체를 자동으로 제거함.
p1, p2가 일반포인터처럼 동작하게 하려고 (Point클래스에 정의된 멤버 함수를 사용하기 위하여)
->연산자와 * 연산이 가능하도록 연산자 오버로딩을 함.
->연산자의 경우 포인터를 리턴받고 *은 참조를 리턴받아 호출
저기서 PointPtr p1=new Point(1,2)의 경우
동적할당이긴 한데. 순서가 PointPtr의 생성자에 new Point(1,2) 동적할당한 값을 넣는것이다.
암시적 생성자를 Point = 10; 이렇게 생성하는건데..
아무튼 PointPtr앞에 explicit를 붙이게 되면..좀더 명확히 써야한다.
이런식으로..
Point *ptr=new Point(3,4);
PointPtr p1(ptr);킹킹..
'@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글
메서드 오버라이딩의 특수한 경우들(1) (0) 2014.03.03 ostringstream (0) 2014.03.02 재귀함수를 이용한 팩토리얼 구하기, 최대공약수 구하기 (0) 2013.03.12 파일 입출력..ifstream / ofstream 다시 한번정리.. (1) 2013.03.09 2차원 동적배열 생성, 초기화, 복사 (0) 2013.02.24