nakka soft world !
스마트 포인터 (Smart Pointer) 본문
스마트 포인터 (Smart Pointer)
다른 타입의 포인터 역활을 하는 객체를 smart pointer 라고 합니다.
-> 연산자와 * 연산자를 재정의해서 다른 타입의 포인터 역활을 하는 객체를 무엇이라고 하나요(영어, 소문자로 적어 주세요) ? 스마트 포인터
1. 개요
class Car
{
private:
int color;
public:
~Car() { cout << "Car delete" << endl; }
void Go() { cout << "Car go" << endl; }
};
class Ptr
{
private:
Car* obj;
public:
Ptr(Car* p = 0) : obj(p) {}
~Ptr() { delete obj; }
Car* operator->() { return obj; }
Car& operator*() { return *obj; } // 주의 반드시 참조리턴해야함.
};
int main()
{
//Car* p = new Car;
Ptr p = new Car; // Ptr p(new Car); // p함수에 car의 인터를 넘김, Car포인터를 받는 함수가 구현 되어 있음
p->Go(); // (p.operator0>())Go()
// (p.operator->())->Go
// ( 2000 ) ->Go
(*p).Go(); // p.operator*()
// Block 을 벗어 날때 Ptr의 소멸자가 호출됨., 소멸자에 delete해두면 굳이 delete하지 않아도 자동으로 관리가 됨.
}
// 임의의 개체가 다른 타입의 포인터 역할을 하는 것
// 대부분의 스마트 포인터는 참조 계수 기법을 사용합니다. 또한, 복사 금지를 사용하는 경우도 있습니다.
2. 참조 계수
tmeplate<typename T> class Ptr
{
private:
T* obj;
public:
Ptr(T* p = 0) : obj(p) {}
~Ptr() { delete obj; }
T* operator->() { return obj; }
T& operator*() { return *obj; }
};
int main()
{
Ptr<int> p1 = new int;
*p1 = 10;
cout <*p1 << endl;
}
3. shared_ptr
#include <iostream>
#include <memory>
using namespace std;
class Ptr
{
private:
Car* obj;
public:
Ptr(Car* p = 0) : obj(p) { cout << << endl; }
void Go() { const << "Car gogog" << endl; }
};
int main()
{
shared_ptr<Car> p(new Car);
p->Go();
(*p).Go;
}
// C++ 표준 스마트포인터의 이름은 shared_ptr 입니다.
'프로그래밍언어 > C++' 카테고리의 다른 글
String 클래스 만들기 (0) | 2017.03.19 |
---|---|
대입연산자 (assignment operator) (0) | 2017.03.19 |
함수 객체(function object, fonctor) (0) | 2017.03.19 |
증가/감소 연산자 재정의 (0) | 2017.03.19 |
cout & ostream (0) | 2017.03.19 |