pointer-like classes

pointer-like classes

C++中有三种智能指针,其实,他们内部都是真正的普通指针,如图,

我们知道,一般指针操作的符号有"*",和“->”,因此,我们的智能指针也应该设计这两个符号的函数,即重载前面两个操作符

T& operator*()const { return *px; }
T& operator->()const { return px; }

那么,这两个函数如何使用呢?

 1 struct Foo
 2 {
 3     void method(void) { ; }
 4 };
 5 
 6 shared_ptr<Foo> sp(new Foo);
 7 Foo f(*sp);
 8 sp->method();
 9 
10 px->method();

看上面,第6行,new一个Foo 得到的指针当做初值,创建对象就会调用构造函数,将p传递给px,就如最上方的图所示,接下来使用者使用的就是整个的圆圈表示的智能指针,所以,使用者就会把它当做一般指针使用,使用"*"和"->",所以设计者就按照使用方式设计了重载操作。这里解释一下,第10行是为了理解,第8行就是相当于第10行

  • 迭代器

迭代器也可以说是一种智能指针,从下面的代码可以看出,迭代器这种智能指针不但要处理"*","->",还要处理"++","--","==","!=","++","--",

 1 template <class T>
 2 struct __list_node* {
 3     void* prev;
 4     void* next;
 5     T data;
 6 };
 7 template<class T,class Ref,class Ptr>
 8 struct __list_iterator {
 9     typedef __list_iterator<T, Ref, Ptr>self;
10     typedef Ptr pointer;
11     typedef Ref reference;
12     typedef __list_node<T>* link_type;
13     link_type node;
14     bool operator==(const self& x)const { return node == x.node; }
15     bool operator!=(const self& x)const { return node != x.node; }
16     reference operator*()const { return (*node).data; }
17     pointer operator->()const { return &(operator*()); }
18     self& operator++() { node = (link_type)((*node).next); }
19     self& operator++(int) { self tmp = *this; ++*this; return tmp; }
20     self& operator--() { node = (link_type)((*node).prev);}
21     self& operator--(int) { self tmp = *this; --*this; return tmp; }
22 };

链表结构如图图中红色的圆点代表链表的迭代器,其中必然有一个真正的指针,就是上面的13行中的node,它的类型是 link_type ,追溯到上一行,可以看出是一个指针,所以16行就是对node解引用,取得的就是上图中显示的内容,后面又接着使用的"."操作符,就是再取取得的node中的内容中的data部分

"->"的使用类似,如下面

list<Foo>::it;
....
*it;//获得一个Foo 对象
it->method();//call Foo::method(),相当于(*it).method();
//也相当于(&(it))->method()

 

posted @ 2018-02-08 22:23  Holly_U  阅读(194)  评论(0编辑  收藏  举报