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-> 得到的东西会继续用 -> 作用上去,相当于这个->符号用了两次

image-20230807095542200

2.1.2 迭代器

以标准库中的链表迭代器为例,这种智能指针还需要处理 ++ -- 等符号

node 是迭代器包着的一个真正的指针,其指向 _list_node

image-20230807100734372

  • 下图 *ite 的意图是取 data——即一个 Foo 类型的 object
  • 下图 ite->method 的意图是调用 Foo 中的函数 method

image-20230807100804223

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);

...