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这样的代码就是很合理了。
operator*() 和 operator-()相关推荐
- C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)
八.如何写出一个安全的operator= 首先,operator=的返回值通常是一个类的引用,这一点需要和C++标准库的容器类的operator=保持一致 其次,如果一个类中含有指针成员,那么要防止自 ...
- 课时 24:Kubernetes API 编程利器:Operator 和 Operator Framework(夙兴)
本节课程主要分享以下三方面的内容: operator 概述 operator framework 实战 工作流程 operator 概述 基本概念 首先介绍一下本节所涉及到的基本概念. CRD (Cu ...
- C++ new/new operator、operator new、placement new初识
简要释义 1.operator new是内存分配函数(同malloc),C++在全局作用域(global scope)内提供了3份默认的operator new实现,并且用户可以重载operator ...
- operator.ne_Python operator.ne()函数与示例
operator.ne operator.ne()函数 (operator.ne() Function) operator.ne() function is a library function of ...
- python operator __gt___Python operator.gt方法代码示例
本文整理汇总了Python中operator.gt方法的典型用法代码示例.如果您正苦于以下问题:Python operator.gt方法的具体用法?Python operator.gt怎么用?Pyth ...
- operator 与operator
之前一直搞不懂operator 与&operator的区别. 简单来说就是operator 返回的是这个值,而&operator返回的是这个的地址. 主要的区别于用处就在于这个运算符的 ...
- operator和operator
// operator和&operator !#include <iostream> using namespace std; //声明 class Point; Point op ...
- 从零开始入门 K8s | Kubernetes API 编程利器:Operator 和 Operator Framework
作者 | 夙兴 阿里巴巴高级工程师 本文整理自<CNCF x Alibaba 云原生技术公开课>第 24 讲,点击"阅读原文"直达课程页面. 关注"阿里 ...
- C++ 中 new 操作符内幕:new operator、operator new、placement new
一.new 操作符(new operator) 人们有时好像喜欢有意使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...
- operator=、operator[]、operator()操作符重载
重载赋值运算符= 赋值运算符重载用于对象数据的复制 operator= 必须重载为成员函数 重载函数原型为:类型 & 类名 :: operator= ( const 类名 & ...
最新文章
- 后端必备:15000 字的 SQL 语句大全
- 8.1 A Bayesian Methodology for Systemic Risk Assessment in Financial Networks(2)
- JAVA NIO之文件通道
- docker 如何删除<none>镜像
- Java和PHP在Web开发方面的比较
- HTTP 返回状态消息讲解
- Java中的正则表达式–软介绍
- java计算面积的方法_JAVA多态计算面积main函数调用方法
- 在php中isset什么意思,php – isset()和__isset()之间有什么区别?
- Dungeon Master 地下城大师(BFS进阶)
- event.srcElement 说明 方法 技巧
- FastDFS单机搭建以及java客户端Demo
- Bypass功能及原理介绍
- 如何把qq挂到云服务器,云服务器挂QQ软件常用方法和注意问题
- 一文带你详尽剖析Miracast投屏开发和调试
- 四种方法解决JumpGame
- w7计算机开机密码怎么设置,如何设置电脑开机密码,图文教你怎么设置开机密码(winxp/win7)...
- 减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
- Failure obtaining db row lock: Lock wait timeout exceeded; try restarting transaction java定时任务
- .NET平台机器学习资源汇总,有你想要的么?
热门文章
- 应该担心什么不应该关心什么(做正确的事,把事情做对)
- 富士康打工到底能不能攒到钱?
- Win8.1 KB2919355更新无法正常安装完成,如何正确,这是我的方法。
- 用MOS管驱动电机吧
- java8新特性获取(当月,上月,下月)(第一天,最后一天)
- 世界最迷人的白色海岸线
- 未明学院:追剧一个月,我才发现《长安十二时辰》是一部大数据破案指南
- E: Release file for http://xxx is not valid yet (invalid for another 8h 3min 53s). Updates for this
- K8S POD无限重启问题
- Hperledger Fabric入门课程3 ——软硬件环境