最近在看侯捷的《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这样的代码就是很合理了。

operator*() 和 operator-()相关推荐

  1. C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)

    八.如何写出一个安全的operator= 首先,operator=的返回值通常是一个类的引用,这一点需要和C++标准库的容器类的operator=保持一致 其次,如果一个类中含有指针成员,那么要防止自 ...

  2. 课时 24:Kubernetes API 编程利器:Operator 和 Operator Framework(夙兴)

    本节课程主要分享以下三方面的内容: operator 概述 operator framework 实战 工作流程 operator 概述 基本概念 首先介绍一下本节所涉及到的基本概念. CRD (Cu ...

  3. C++ new/new operator、operator new、placement new初识

    简要释义 1.operator new是内存分配函数(同malloc),C++在全局作用域(global scope)内提供了3份默认的operator new实现,并且用户可以重载operator ...

  4. operator.ne_Python operator.ne()函数与示例

    operator.ne operator.ne()函数 (operator.ne() Function) operator.ne() function is a library function of ...

  5. python operator __gt___Python operator.gt方法代码示例

    本文整理汇总了Python中operator.gt方法的典型用法代码示例.如果您正苦于以下问题:Python operator.gt方法的具体用法?Python operator.gt怎么用?Pyth ...

  6. operator 与operator

    之前一直搞不懂operator 与&operator的区别. 简单来说就是operator 返回的是这个值,而&operator返回的是这个的地址. 主要的区别于用处就在于这个运算符的 ...

  7. operator和operator

    // operator和&operator !#include <iostream> using namespace std; //声明 class Point; Point op ...

  8. 从零开始入门 K8s | Kubernetes API 编程利器:Operator 和 Operator Framework

    作者  |  夙兴  阿里巴巴高级工程师 本文整理自<CNCF x Alibaba 云原生技术公开课>第 24 讲,点击"阅读原文"直达课程页面. 关注"阿里 ...

  9. C++ 中 new 操作符内幕:new operator、operator new、placement new

    一.new 操作符(new operator) 人们有时好像喜欢有意使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...

  10. operator=、operator[]、operator()操作符重载

    重载赋值运算符= 赋值运算符重载用于对象数据的复制 operator= 必须重载为成员函数 重载函数原型为:类型  &  类名  :: operator= ( const  类名 & ...

最新文章

  1. 后端必备:15000 字的 SQL 语句大全
  2. 8.1 A Bayesian Methodology for Systemic Risk Assessment in Financial Networks(2)
  3. JAVA NIO之文件通道
  4. docker 如何删除<none>镜像
  5. Java和PHP在Web开发方面的比较
  6. HTTP 返回状态消息讲解
  7. Java中的正则表达式–软介绍
  8. java计算面积的方法_JAVA多态计算面积main函数调用方法
  9. 在php中isset什么意思,php – isset()和__isset()之间有什么区别?
  10. Dungeon Master 地下城大师(BFS进阶)
  11. event.srcElement 说明 方法 技巧
  12. FastDFS单机搭建以及java客户端Demo
  13. Bypass功能及原理介绍
  14. 如何把qq挂到云服务器,云服务器挂QQ软件常用方法和注意问题
  15. 一文带你详尽剖析Miracast投屏开发和调试
  16. 四种方法解决JumpGame
  17. w7计算机开机密码怎么设置,如何设置电脑开机密码,图文教你怎么设置开机密码(winxp/win7)...
  18. 减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
  19. Failure obtaining db row lock: Lock wait timeout exceeded; try restarting transaction java定时任务
  20. .NET平台机器学习资源汇总,有你想要的么?

热门文章

  1. 应该担心什么不应该关心什么(做正确的事,把事情做对)
  2. 富士康打工到底能不能攒到钱?
  3. Win8.1 KB2919355更新无法正常安装完成,如何正确,这是我的方法。
  4. 用MOS管驱动电机吧
  5. java8新特性获取(当月,上月,下月)(第一天,最后一天)
  6. 世界最迷人的白色海岸线
  7. 未明学院:追剧一个月,我才发现《长安十二时辰》是一部大数据破案指南
  8. E: Release file for http://xxx is not valid yet (invalid for another 8h 3min 53s). Updates for this
  9. K8S POD无限重启问题
  10. Hperledger Fabric入门课程3 ——软硬件环境