nakka soft world !

스마트 포인터 (Smart Pointer) 본문

프로그래밍언어/C++

스마트 포인터 (Smart Pointer)

nakka 2017. 3. 19. 03:20
728x90

스마트 포인터 (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 입니다.

728x90

'프로그래밍언어 > 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
Comments