operator*() 和 operator->()

最近在看侯捷的《STL源码剖析》,在实现iterator的时候,肯定要重载*和->。比如__deque_iterator里面的这两个操作符重载如下:

reference operator*() const { return *cur; }

pointer operator->() const { return &(operator*()); }

我一直觉得STL的源码很美,但这里我却有个疑问。为什么operator->()要这样实现,而不是简单的return cur;

我在VC8自带的头文件里面看到了这样的实现:

reference operator*() const
{    // return designated object
    size_type _Block = _Myoff / _DEQUESIZ;
    size_type _Off = _Myoff & (_DEQUESIZ - 1);    // assume power of 2
    _SCL_SECURE_VALIDATE(this->_Mycont != NULL);
    _SCL_SECURE_VALIDATE_RANGE(_Myoff < ((_Mydeque *)(this->_Mycont))->_Myoff + ((_Mydeque *)(this->_Mycont))->_Mysize);
    if (this->_Mycont->_Mapsize <= _Block)
        _Block -= this->_Mycont->_Mapsize;
    return ((this->_Mycont->_Map)[_Block][_Off]);
}

pointer operator->() const
{    // return pointer to class object
    return (&**this);
}

先不用去研究operator*()的具体实现,但是可以看到operator->()的实现也很独特,其实就是在(*this)上调用operator*(),再对其返回值取地址。

我想这样做也有原因,大概是为了统一吧。一般说来在operator->()中调用operator*()再取地址,应该没有什么错,我们不必在operator->()再去访问其底层实现。比如在VC8的版本中,operator*()的实现不是非常的直观简单,也许operator->()要访问其底层实现也会这么复杂,又不统一,又容易出错。

由此STL这样的代码就是很合理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值