欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++程序设计兼谈对象模型(侯捷)——课程笔记(二)

程序员文章站 2022-04-27 10:21:43
...

本篇内容为pointer-like classes,直译过来就是像指针的类,就比如说C++里面的智能指针,迭代器等都是这样的东西。本篇只讨论这类class的语法,不涉及智能指针,迭代器等的使用细节。

一、关于智能指针

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;
    long* pn;
......
};

struct Foo
{
    ...
    void method(void);
};

shared_ptr<Foo> sp(new Foo());

Foo f(*sp);

sp->method(); //相当于执行px->method()

关键的就是两个操作符的重载,operator*()和operator->()。对于*的重载返回的是指针所指对象的引用,返回值应该是引用类型,因为这个对指针解引用这个操作是可以作为左值的。对于->的重载有一个比较tricky的地方,就是比如说上例中的sp->method()相当于执行px->method(),但是sp->按理说返回的只是px,也就是调用sp的操作符重载将会消耗一个->,那为什么对于px还是会有一个->呢?我们可以这样理解:箭头符号比较特别,得到的东西会继续使用箭头符号作用上去,可以理解为语言设计的一个规则。

二、关于迭代器

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;
    bool operator==(const self& x) const { return node == x.node; }
    bool operator==(const self& x) const { return node == x.node; }
    reference operator*() const { return (*node).data; }
    pointer operator->() const { return &(operator*()); }
    ...
};

重要的还是两个操作符重载函数