本节书摘来自异步社区出版社《C++覆辙录》一书中的第2章,第2.12节,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.12:晦涩难懂的operator ->

内建的operator ->是二元的,左手边的操作数是一个指针,右手边的操作数是一个class成员的名字。而重载版本的operator ->则是一元的:class Ptr{ public:  Ptr( T *init);  T *operator ->();  // ... private:  T *tp_;};```对重载版本的`operator->`的调用,必须返回一个可以用直接或间接地调用内建的`operator->`访问其成员的对象26:

Ptr p( new T );

p->f(); // 表示"p.operator ->()->f()"!`

用某种视角来看,我们可以把实际发生的事理解成词法单位->没有被“吃掉”,而是保留下来“派真正的用场”,如同内建的operator ->一样。典型地,重载版本的operator ->被赋予了一些额外的语义,以支持“智能指针”型别:T *Ptr::operator ->(){  if ( today() == TUESDAY )      abort();  else     return tp_;}```前面说过了,重载版本的operator ->必须返回支持成员访问操作的“某物”。此“某物”并非一定要是个内建的指针。它亦可以是一个重载了``operator ->`的` class`对象:

class AugPtr{

public:

AugPtr(T *init) : p_(init){}

Ptr &operator ->();

// ...

private:

Ptr p_;

};

1.jpg gotcha24/ptr.cpp

Ptr &AugPtr::operator ->(){

if (today() == FRIDAY)

cout<

}`

这样就可以支持智能指针的级联应用(cascading)了:AugPtr ap( new T );ap->f(); // 实际上是"ap.operator ->().operator ->()->f()"!```请注意,operator ->的调用序列的触发(`activation`)总是由包含`operator ->`定义的对象27静态决定的,而且该调用序列总是终结于返回指涉到`class`对象的内建指针的调用。举个例子,对AugPtr调用operator ->总是会触发以下调用序列:先是调用AugPtr:`:operator->`,接着调用Ptr::operator->,再接着调用T *型别内建指针上的Ptr::`operator->`(若要检视一个更具实践参考意义的例子,请参见常见错误83)。

晦涩难懂的c语言语句,《C++覆辙录》——2.12:晦涩难懂的operator -相关推荐

  1. 晦涩难懂的c语言语句,【c/c 学习心得】晦涩难懂的const关键词,const v.s. 指标值...

    今天要介紹的是c/c++語言的關鍵字-const, 簡單來說,const是constant,常數的縮寫, 常數就是恆常不變的數值, 一但經初始化就無法再改變其值, 而且必須在宣告的時候便初始化 基礎語 ...

  2. 不正确的c语言语句是,最基本的C语言语句是( )

    最基本的C语言语句是( ) 更多相关问题 [单选] ADSL.MODEM最好在什么温度下工作(). [单选] 连接计算机网卡和ADSL猫的五类双绞线为(). [单选] 如ADSL分离器位置安装不正确可 ...

  3. C语言语句知识结构大学霸IT达人

    C语言语句知识结构大学霸IT达人 语句是代码执行过程中的最基本单位,每个语句都能实现一个或多个动作.语句最显著的标识就是结尾的英文分号.分号表示该行代码为一条语句.在C语言中语句可以分为表达式语句,控 ...

  4. 《C++覆辙录》——1.9:使用糟糕的语言

    摘要: 本节书摘来自异步社区出版社<C++覆辙录>一书中的第1章,第1.9节,作者: [美]Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区& ...

  5. python语言句块的标记_Python语言语句块的标记是()

    [简答题] [单选题]Listen( 1.1-1) and answer: Karen Wood is ___________. [单选题]下列说法正确的是 ( ). [判断题]旅游的实质实人类追求自 ...

  6. C语言 | 语句概述

    C语言语句的作用和分类 1.9种控制语句 if()...else.. //条件语句 for()... //循环语句 while()... //循环语句 do...while() //循环语句 cont ...

  7. Verilog语言语句介绍

    Verilog语言语句介绍 结构语句 initial语句 always语句 赋值语句 阻塞赋值 非阻塞赋值 使用方法 条件语句 if_else语句 case语句 结构语句 共有两个重要的结构语句 in ...

  8. 不正确的c语言语句是,【单选题】下列不正确的C语言语句是( )。 A. x=y=5; B. x=1,y=2; C. y=int x; D. x++;...

    [单选题]下列不正确的C语言语句是( ). A. x=y=5; B. x=1,y=2; C. y=int x; D. x++; 更多相关问题 1千克棉花的14与2千克铁的12一样重.______. 在 ...

  9. python 语句块标记_什么是python中的语言语句块标记

    什么是python中的语言语句块标记 发布时间:2020-07-16 10:05:20 来源:亿速云 阅读:172 作者:Leah 什么是python中的语言语句块标记?很多新手对此不是很清楚,为了帮 ...

  10. php语句以什么符号结束,c语言语句以什么结束,c语言语句的结束标志

    c语言语句以什么结束C语言句子以什么结尾,c语言的每一句都是用英语输入的[:]结束一个语句,不同的编辑语言有不同的结束符号,Java和C也是基于[:]作为一行语句结束的标志,也没有必要使用[:]作为一 ...

最新文章

  1. Mac下Android配置及unity3d的导出Android
  2. ActionScript3.0自定义Flex组件问题 重写组件的使用
  3. C#上位机串口软件开发--第1讲 工程创建
  4. 数据库读写分离(aop方式完整实现)
  5. Windows 上配置Docker Desktop 的k8s
  6. 【渝粤教育】电大中专职业生涯规划 (2)_1作业 题库
  7. mysql配置 | 快速上手Linux玩转典型应用
  8. SIP消息头域的说明
  9. java怎么连不上xml_java mvc web 项目web.xml头改错了,死活加载不上springMvc的jar
  10. ETL增量单表同步简述_根据dateTime增量
  11. breadcrumb 根据路由_简单的vue-router面包屑转化
  12. 通过Process调用桌面程序
  13. SAP培训及ABAP学习入门必读
  14. 如何把map的value转为list_如何在Java中将Map转换为List?
  15. 新派重型混音教程|看了几年的混音教程,自己还是没有进步。(思想篇+技术篇+扫盲5个误区)|MZD Studios
  16. 频谱泄露、栅栏效应、补零实验
  17. 软件工程与计算-11-人机交互设计
  18. sun java system calendar 服务器拒绝服务_sun java system cale
  19. 计算机输入输出接口形式,输入输出接口-微计算机原理-电子发烧友网站
  20. java两张图片拼接

热门文章

  1. C语言实现七夕表白爱心
  2. 表白神器java代码_java制作七夕表白神器的方法
  3. 做自媒体,学视频剪辑须知的四大宝藏网站
  4. 用matlab求二重积分
  5. 如何自定义 conventional-changelog
  6. jmeter的吞吐量控制器
  7. 常见的平均查找长度总结
  8. 理]疏通中国历史脉络——“魏(三国)、晋(五胡十六国)、南北朝”篇
  9. LLC谐振变换器原理及变频控制
  10. 地震响应分析中土体动力本构模型