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()
勿在浮沙筑高台