2 xxx-like classes
2.1 pointer-like classes
2.1.1 智能指针
- 设计得像指针class,能有更多的功能,包着一个普通指针
- 指针允许的动作,这个类也要有,其中
*
,->
一般都要重载
template <typename T>
class shared_ptr
{
public:
T& operator*() const { return *px; }
T* operator->() const { return px; }
shared_ptr(T* p) : ptr(p) {}
private:
T* px;
long* pn;
};
在使用时,
*shared_ptr1
就返回*px
;但是
shared_ptr1->
得到的东西会继续用->
作用上去,相当于这个->符号用了两次![]()
2.1.2 迭代器
以标准库中的链表迭代器为例,这种智能指针还需要处理 ++
--
等符号
node
是迭代器包着的一个真正的指针,其指向 _list_node
![image-20230807100734372](https://raw.githubusercontent.com/PLUS-WAVE/blog-image/master/img/blog/2023-08-07/image-20230807100734372.png)
- 下图
*ite
的意图是取data
——即一个 Foo 类型的 object - 下图
ite->method
的意图是调用 Foo 中的函数 method
![image-20230807100804223](https://raw.githubusercontent.com/PLUS-WAVE/blog-image/master/img/blog/2023-08-07/image-20230807100804223.png)
2.2 function-like classes
设计一个class,行为像一个函数
函数行为即 —— xxx()
有一个小括号,所以函数中要有对 ()
进行重载
template <class pair>
struct select1st ... // 这里是继承奇特的Base classes,先不管
{
const typename pair::first_type& // 返回值类型,先不管
operator()(const pair& x) const
{
return x.first;
}
};
...
//像一个函数一样在用这个类
select1st<my_pair> selector;
first_type first_element = selector(example_pair);
//还可以这样写,第一个()在创建临时对象
first_type first_element = select1st<my_pair>()(example_pair);
...