[C++] pointer-like classes 和 function-like classes

1. pointer-like class 意思是像指针的类,是指一个类被设计成像指针一样,可以当做指针来使用。下面来介绍两种常见的指针类:智能指针和迭代器。

a. 智能指针

namespace ll {
    template<class T>
    class shared_ptr
    {
    public:
        T& operator* () const {
            return *px;    //返回指针所指的对象
        }
        T* operator->() const {
            return px;
        }
        shared_ptr(T* p): px(p) {}
    private:
        T *px;    
    };
}

struct Foo
{
    void method() {
        cout << "method" << endl;
    }
};

ll::shared_ptr<Foo> sp(new Foo);  // 定义了一个指向Foo类型的智能指针
Foo f(*sp);  // 定义了一个Foo对象,并使用智能指针sp所指向的对象来进行初始化
f.method();  // 通过对象f调成成员函数
sp->method();  // 见下面的解释

  上述代码申明了一个智能指针sp,并通过->操作符来调用成员函数。sp->method();会首先调用操作符函数 operator->() const,得到智能指针内部真实的指针px,然后再通过px调用method函数(px->method())。在这里的疑问是,sp->通过调用操作符函数operator->()已经消耗了一个->符号,px->method()的->是如何来的?C++规定,对于调用->操作符后,->操作符并不消耗,而是会继续作用下去,这样一来,sp->method();便等同于sp->method();

b.迭代器

namespace ll {
    template<class T>
    struct __list_node {
        void *prev;
        void *next;
        T data;
    };

    template<class T, class Ref, class Ptr>
    struct __list_iterator {
        typedef __list_iterator<T, Ref, Ptr> self;
        typedef Ptr pointer;
        typedef Ref reference;
        typedef __list_node<T>* link_type;
        link_type node;

        reference operator*() const {
            return (*node).data;
        }
        pointer operator->() const {
            return &(operator*());
        }
        self& operator++() {
            node = (link_type)((*node).next);
            return *this;
        }
        self& operator--() {
            node = (link_type)((*node).prev);
            return *this;
        }  
    };
}



//上述代码的使用代码
struct Foo
{
    void method() {
        cout << "method" << endl;
    }
};

ll::__list_iterator<Foo, Foo&, Foo*> iter;
*iter;  // 获得一个Foo对象
iter->method();  // 意思是调用Foo::method(),相当于(*iter).method(),也相当于(&(*iter))->method()

  首先,我们申明一个_list_iterator迭代器iter,通过*操作符可以得到一个Foo对象,iter->method();则调用Foo::method(),解释如下:

  iter->method();会首先调用operator->() const函数,由于operator->() const里还会调用operator*()先取得data,然后再取地址,所有operator->() const会返回data的地址,在上例中即是Foo对象的地址,这样,通过->操作符便可以调用到Foo::method();

注:->符号的含义, 成员提取,例如 A->B, A是指向类、结构、联合的指针,A->B是指提取A中的成员B。

 

2. function-like classes 仿函数的类

  仿函数的类的特点是重载了操作符operator(),如下面的例子:


template <class T1, class T2>
struct pair
{
  T1 first;
  T2 second; //first和second类型不需要一样
  pair() : first(T1()), second(T2()) {}
  pair(const T1& a, const T2& b)
  : first(T1()), second(T2())
......
};



template<class T>
struct identity : public unary_function<T,T>
{
  const T&
  operator() (const T& x) const { return x; }
};
 
template<class Pair>
struct select1st : public unary_function<Pair, typename Pair::first_type>
{
  const typename Pair::first_type&
  operator() (const Pair& x) const { return x.first; }
};
 
template<class Pair>
struct select2nd : public unary_function<Pair, typename Pair::second_type>
{
  const typename Pair::second_type&
  operator() (const Pair& x) const { return x.second; }
};

 

参考博客:

https://blog.csdn.net/lihao21/article/details/50668271

https://blog.csdn.net/SUSU0203/article/details/80478029

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值