类的指针成员管理

原创 2012年03月26日 13:08:32

C++中,标准库的使用大大减少了现代C++程序中对指针的需要。然而,许多应用程序仍然需要使用指针,特别是在类的实现中,并且包含指针的类复制控制方面容易出错。

        具有指针成员的对象一般需要定义复制控制成员。如果依赖合成版本,会给类的用户增加负担。用户必须保证成员所指向的对象存在,只要还有指针指向该对象。为了管理这些具有指针成员的类,必须定义三个复制控制成员:复制构造函数、赋值操作符和析构函数。这些成员可以定义指针成员的指针型行为或值型行为,或者智能指针类(需要一个使用计数类配合)。

大多数C++类采用三种方法管理指针成员。

(1)指针成员采取常规指针型行为。复制指针时只复制指针中的地址,而不会复制指针指向的对象。这样的类具有指针的所有缺陷但无需特殊的复制控制。


常规指针类:

class HasPtr{
public: 
        HasPtr(int *p):ptr(p){}
        HasPtr(const HasPtr& Hp):ptr(Hp.ptr){}
        int get_ptr()const{retrun ptr;}
        void set_ptr(int *p){ptr=p;}
        int get_ptr_val()const {return *ptr;}
private:
        int *ptr;
}
如(出现悬垂指针!!!)
int *p=new int(10);
HasPtr ptr(p);//HasPtr points to same object as p does
delete p;//object pointed to by p is freed
ptr.set_ptr_val(0);//disaster: The object to which HasPtr points was freed!

(2)类可以实现所谓的“智能指针”(smart pointer)行为。指针所指的对象仍是共享的,但类能够防止悬垂指针(指向了不存在的对象的指针)。

         解决办法:为指向同一共享对象的指针引入了一个使用计数use count:记录指向共享对象的类对象数目。初始:新创建一个类对象,使用计数初值为1。

         即智能指针将一个计数器与类指向对象想关联起来。

使用计数类(有两种经典策略实现,另一种见:句柄类区别在于:类指针成员所指对象由谁直接关联(智能指针类:由使用计数类直接关联;句柄类:由句柄类自己直接关联。)):这里:定义一个单独的具体类:封装使用计数和相关指针。

class HasPtr;//智能指针类声明
class U_Ptr{ //定义为私有(class默认:private)
      friend class HasPtr;//友元     
      int *ip;
      size_t use; 
      U_Ptr(int *p):ip(p),use(1){}
      ~U_Ptr(){delete ip;}
}


智能指针类:

     class HasPtr{public: HasPtr(int *p):ptr(new U_Ptr(p)){} 
      HasPtr(const HasPtr& Hp):ptr(Hp.ptr){++ptr->use}  
      int get_ptr()const{retrun ptr;} 
      void set_ptr(int *p){ptr=p;}
      int get_ptr_val()const {return *ptr;}
      HasPtr& operator=(const HasPtr&rhs) 
      {
             ++rhs.ptr->use;//可防止自身复制 
             if(--ptr->use==0)delete ptr; 
             ptr=rhs.ptr; 
             return *this; 
       }
       ~HasPtr(){if(ptr->use==0)delete ptr;}
private: U_Ptr *ptr;
};


(3)类采取值型行为。将指针成员所指基础值的副本给每个对象。每个指针所指向的对象是唯一的,由每个类对象独立管理。
使指针成员表现的想一个值(指针的值型行为),复制值型对象时,会得到一个不用的新副本。即复制指针所指向的对象,而不是复制指针本身。


值型类:

class HasPtr{
public:
       HasPtr(const int *p):ptr(new int(*p)){}
       HasPtr(const HasPtr& orig):ptr(new int (*orig.ptr)){}
       HasPtr& operator=(const HasPt&rhs)
       {
              *ptr=*rhs.ptr;
               return 0;
       }
       int get_ptr_val()const{return *ptr;}
       int* get_ptr()const{return ptr;}
       void set_ptr(int *p){ptr=p;}
       ~HasPtr(){delete ptr;}
private:
       int *ptr; 
};













                

C++之类成员指针

一、指向成员变量的指针并非指针          C++中指向成员变量的指针其实是一个相对于类对象的偏移量。《C++必知必会》的条款15讲述了这一说法:“与常规指针不同,一个指向成员变量的指针并不指向...
  • e5Max
  • e5Max
  • 2013年09月14日 14:25
  • 9223

指向类的静态和非静态成员的指针

#include class Point{ public: Point(int xx=0,int yy=0) { X=xx; Y=yy; } Point(Point &p); ...
  • Sun19910114
  • Sun19910114
  • 2014年08月26日 19:07
  • 909

C++类成员指针的意义

C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难...
  • captain_wangnb
  • captain_wangnb
  • 2016年01月12日 16:54
  • 1190

用指针访问类中private成员

C++中,利用指针可以访问private数据成员。先看下面代码://利用指针访问private成员 #include using namespace std; class CTest { ...
  • hzqnju
  • hzqnju
  • 2011年05月09日 17:29
  • 2202

C++类中成员变量和成员指针变量小结

指针的确有点难理解,不过它之所以存在并大范围使用,这样做是有一定道理的。 一、C++中的类和结构使用指针定义成员作用 1、多态的要求。 如果要使用同一接口,多态设计,那么就一定要使用基类指针。只有...
  • u014328353
  • u014328353
  • 2016年01月27日 14:05
  • 2756

类外通过void指针间接访问类内私有成员变量

A member of a class can be — private; that is, its name can be used only by members and friends of ...
  • sgzqc
  • sgzqc
  • 2016年05月20日 10:21
  • 887

关于类成员变量为引用与指针的思考

记得C++好像有条准则,似乎是说当成员变量中含有指针时,就需要重写类的拷贝构造函数和赋值运算符,否则将会调用默认的构造函数,如果不重写,当调用拷贝构造函数将会有内存泄露的风险。如果你不想重写类的拷贝构...
  • Andeewu
  • Andeewu
  • 2013年04月26日 18:40
  • 2286

C++中类成员对象与指针的区别

C++编程过程中,在一个类的数据成员是一个类时,定义这个成员变量为对象还是指针是有讲究的。 在C++中, ClassTest objTest;就已经构造了对象,分配了空间 而在C#、Java中,...
  • nbaDWde
  • nbaDWde
  • 2017年03月29日 22:46
  • 461

含有指针成员时的赋值运算符重载

如果类封装了原始指针,如下面这个类:class MyString { private: char* Buffer;public: // constructor MyString(co...
  • q__y__L
  • q__y__L
  • 2016年04月12日 21:26
  • 896

C++学习之对象成员指针篇

所谓对象成员指针就是让一个类的对象的指针作为另外一个类的成员变量,对象成员就是让一个类的对象成为另一个类的成员变量。下面以代码举例说明: 公用坐标类: class Coordinate { p...
  • hudfang
  • hudfang
  • 2016年01月14日 18:32
  • 924
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的指针成员管理
举报原因:
原因补充:

(最多只允许输入30个字)