读C++ Primer 之智能指针


读C++ Primer 之智能指针

  1. /* 
  2. * author: xizero00 
  3. * mail:xizero00@163.com 
  4. * date:2011-08-07 20:19:11  
  5. * smart pointer sample 
  6. */  
  7.   
  8.   
  9. #include <iostream>   
  10. using namespace std;  
  11.   
  12.   
  13. //智能指针类   
  14. class smartPtr  
  15. {  
  16.     //友元类   
  17.     friend class HasPtr;  
  18. private:  
  19.     //实际的指针   
  20.     int *p;  
  21.     //引用计数   
  22.     size_t use;  
  23.     //智能指针类的构造函数   
  24.     smartPtr( int *ptr ): p( ptr ) , use (1) {}  
  25.     //析构函数   
  26.     ~smartPtr() { delete p; }  
  27.       
  28. };  
  29.   
  30. //使用智能指针的类   
  31. //使用智能指针的类一般需要  复制构造函数、赋值操作符重载、析构函数   
  32. class HasPtr  
  33. {  
  34. private:  
  35.     smartPtr *ptr;  
  36.     int val;  
  37. public:  
  38.     //默认构造函数   
  39.     HasPtr(): ptr( NULL ) , val( 0 ) {}  
  40.       
  41.     //带参数的构造函数   
  42.     HasPtr( int *p , int v ): ptr( new smartPtr( p ) ) , val( v ) {}  
  43.       
  44.     //复制构造函数   
  45.     HasPtr( const HasPtr &h ): ptr( h.ptr ) , val( h.val ) { ++ptr->use; }  
  46.       
  47.     //赋值重载,用于对赋值操作进行监控   
  48.     HasPtr& operator= ( const HasPtr& );  
  49.       
  50.     //析构函数,监控删除操作   
  51.     ~HasPtr() { if( 0 == --ptr->use ) delete ptr; } // 判断是否为最后一个引用   
  52.           
  53.       
  54.     //属性   
  55.     int get_int() const  
  56.     {  
  57.         return val;  
  58.     }  
  59.       
  60.     void set_int( int v )  
  61.     {  
  62.         val = v;  
  63.     }  
  64.       
  65.     int* get_ptr() const  
  66.     {  
  67.         return ptr->p;  
  68.     }  
  69.       
  70.       
  71.     void set_ptr( int *p )  
  72.     {  
  73.         ptr->p = p;  
  74.     }  
  75.       
  76.       
  77. };  
  78.   
  79. //赋值操作符虫重载   
  80. HasPtr& HasPtr::operator= (const HasPtr &h)  
  81. {  
  82.     ++ h.ptr->use;  
  83.       
  84.     if( 0 == --ptr->use )  
  85.     {  
  86.         delete ptr;  
  87.     }  
  88.       
  89.     ptr = h.ptr;  
  90.     val = h.val;  
  91.     return *this;  
  92. }  
  93.   
  94.   
  95.   
  96.   
  97. int main(int argc , char **argv)  
  98. {  
  99.     int *obj = new int[2]{1 , 2};  
  100.     HasPtr *h1 = new HasPtr( obj , 2 );  
  101.     //HasPtr *h2 = new HasPtr( obj , 1 );   
  102.     HasPtr h3 = *h1;//引用h1其中的指向数据的指针两次   
  103.     cout << "h1:" << *( h1->get_ptr() ) << endl;  
  104.     cout << "h3:" << *( h3.get_ptr() ) << endl;  
  105.       
  106.       
  107.     cout << "删除h1,此时剩下h3" << endl;  
  108.     //如果不用智能指针会导致obj所指向的数据被删除了,   
  109.     //而h3中的会成为悬垂指针   
  110.     //因为这里使用类智能指针   
  111.     //所以不会删除obj所指向的数据的空间,所以不会出错!   
  112.     delete h1;  
  113.     cout << "h3:" << *( h3.get_ptr() ) << endl;  
  114.       
  115.       
  116.     //cout << "h2:" << *h2.get_ptr() << endl;   
  117.       
  118.     return 0;  
  119. }  

编译的环境是g++ 因为数组的初始化用到了c++ 0x的特性,所以编译命令为

  1. g++ HasPtr.cc -std=c++0x  

相关内容