C++重载箭头操作符的理解--c++primer这里有错误

C# WinForm酒店管理系统源码解析:分层架构与Access数据库实战指南 在桌面应用开发中,分层架构与数据访问技术是构建稳定业务系统的核心。通过将界面、业务逻辑与数据操作分离,开发者能有效提升代码的可维护性与可扩展性。以C# WinForm为例,结合ADO.NET与Access数据库,可实现轻量级数据持久化方案。参数化查询不仅防止SQL注入,还规范了数据操作流程。酒店管理系统作为典型的业务场景,完整覆盖了用户管理、房态跟踪、出入登记等流程,是理解分层思想、连接串配置、数据绑定与事务处理的绝佳实践。本文基于一套C# WinForm酒店管理系统源码,剖析其四层架构、数据库操作及常见避 阅读详情

今天看《C++ Primer》的成员访问操作符。看重载箭头操作符部分,刚开始有点迷茫,看了两遍总算有点理解,把心得写在这,与各位分享,如果有错误欢迎指正。
箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员。左操作数为对象指针,右操作数为该对象的成员。定义重载箭头操作符之后看起来就有点特别,可以用类对象的指针来调用,也可以用类对象直接调用。
重载箭头操作符,首先重载箭头操作符必须定义为类成员函数。
箭头操作符可能看起来是二元操作符:接受一个对象和一个成员名,对对象解引用以获取成员。其实箭头操作符是一元操作符,没有显示形参(而且是类成员,唯一隐式形参是this)。->的右操作数不是表达式,而是对应类成员的一个标识符,由编译器处理获取成员工作(编译器对重载箭头操作符所做的事情,比其它重载操作符要多,这里也正是复杂的地方)。
下面这一段是《C++ Primer》重载箭头操作符的内容。

----------------------------------------华丽分割线----------------------------------------
重载箭头操作符
箭头操作符与众不同。它可能表现得像二元操作符一样:接受一个对象和一个成员名。对对象解引用以获取成员。不管外表如何,箭头操作符不接受显式形参。
这里没有第二个形参,因为 -> 的右操作数不是表达式,相反,是对应着类成员的一个标识符。没有明显可行的途径将一个标识符作为形参传递给函数,相反,由编译器处理获取成员的工作。

当这样编写时:
     point->action();

由于优先级规则,它实际等价于编写:
     (point->action)();
换句话说,我们想要调用的是对 point->action 求值的结果。编译器这样对该代码进行求值:

1.如果 point 是一个指针,指向具有名为 action 的成员的类对象,则编译器将代码编译为调用该对象的 action 成员。

2.否则,如果 point(注:中文版误写为action) 是定义了 operator-> 操作符的类的一个对象,则 point->action 与 point.operator->()->action 相同。即,执行 point 的 operator->(),然后使用该结果重复这三步。

3.否则,代码出错。

对重载箭头的返回值的约束
重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。

如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象获取指定成员。如果被指向的类型没有定义那个成员,则编译器产生一个错误。
如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符。编译器检查返回对象所属类型是否具有成员箭头,如果有,就应用那个操作符;否则,编译器产生一个错误。这个过程继续下去,直到返回一个指向带有指定成员的的对象的指针,或者返回某些其他值,在后一种情况下,代码出错。
----------------------------------------华丽分割线----------------------------------------
如果上面分割线之间的内容看懂了,下面的也就不用看了哈。
根据理解,定义了3个类,C包含B,B包含A。A、B、C都定义了一个action的成员函数。B和C都重载箭头操作符,不同的是B的重载箭头操作符返回的是A类对象的指针,而C的重载箭头操作符返回的是B类对象。



代码 


#include <iostream>   
using namespace std;   
  
class A{   
public:   
    void action(){   
        cout << "Action in class A!" << endl;   
    }   
};   
  
class B{   
    A a;   
public:   
    A* operator->(){   
        return &a;   
    }   
    void action(){   
        cout << "Action in class B!" << endl;   
    }   
};   
  
class C{   
    B b;   
public:   
    B operator->(){   
        return b;   
    }   
    void action(){   
        cout << "Action in class C!" << endl;   
    }   
};   
  
int main(int argc, char *argv[])   
{   
    C* pc = new C;   
    pc->action();   
    C c;   
    c->action();    
    getchar();   
    return 0;   
}  
#include <iostream>
using namespace std;


class A{
public:
 void action(){
  cout << "Action in class A!" << endl;
 }
};


class B{
 A a;
public:
 A* operator->(){
  return &a;
 }
 void action(){
  cout << "Action in class B!" << endl;
 }
};


class C{
 B b;
public:
 B operator->(){
  return b;
 }
 void action(){
  cout << "Action in class C!" << endl;
 }
};


int main(int argc, char *argv[])
{
 C* pc = new C;
 pc->action();
 C c;
 c->action(); 
 getchar();
 return 0;
}


这里唯一的问题是为什么会有->自动生成的原因。。。




Cadence IC618/Spectre231安装避坑指南:详解环境变量配置与License管理那些事儿 本文深入解析Cadence IC618/Spectre231安装过程中的环境变量配置与License管理难题,提供从变量冲突解决到高效License管理的实用方案。针对常见的64位标识冲突、路径污染及License服务器连接问题,给出具体诊断步骤和优化建议,帮助用户构建稳定可靠的EDA环境。 阅读详情

相关推荐

temu登录接口逆向分析(含Py纯算)

【代码】temu登录接口逆向分析(含Py纯算)

数据精灵喵 1944

C++重载箭头操作符的理解

C++重载箭头操作符的理解

custa的专栏 1万+

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 292

C++ 类成员访问运算符 -> 重载

类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。 运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。比如,当指针销毁时,或者当指针指

imxiangzi的专栏 2504

ISCC练习题MISC

解题技巧:看最后括号应该是IceCTF,先用了一键解码啥也没有啊,不对不对!好像是字符频率统计,转换网站:http://quipqiup.com/有人给你发了一串信息,你能解开吗?

m0_62737381的博客 1119

【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用

【图像超分】论文精读:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)请配合上述论文精读文章使用,效果更佳!图像超分辨率SRCNN和FSRCNN复现代码,除基本的网络实现外,还有特征图可视化,PSNR曲线图可视化,测试自己的图像数据等不想理解原理,希望直接跑通然后应用到自己的图像数据的同学,请直接下载上面的代码,有训练好的模型,直接用即可。具体使用方式见代码中的README!有问题来本文评论区留言!准备数据集,以及数据预处理。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

c++ 箭头符号怎么打_C++编程基础知识二

运算符:①成员访问运算符:点运算符和箭头运算符;点运算符:获取类对象的一个成员;箭头运算符:ptr->mem 等价于(*ptr).mem;②条件运算符:cond?expr1:expr2;③位运算符:④移位运算符:左移运算符<右移运算符>>:如果运算对象是无符号类型,在左侧插入0;如果是带符号类型,视环境而定;⑤sizeof()返回一条表达式或一个类型名字所占的字节数;对ch...

weixin_39968724的博客 2420

洛达开发--AB1585 PC 工具介绍

洛达常用的PC开发工具包括三款:1)IOT_Flash_Tool是固件烧写工具,支持USB/UART接口下载,需通过断电重启完成烧录;2)EPT是图形化PinMux配置工具,适用于MT25x3/MT768x等芯片的引脚复用设置;3)ATK是综合开发套件,包含日志工具、配置工具、OTA工具和实验室测试工具等组件。这三款工具分别针对固件烧录、硬件配置和系统调试等不同开发环节,形成完整的开发工具链。

Joon2020的博客 669

关于C/C++中的点操作符和箭头操作符

Ps:话说以前竟然一直没有关注到这个问题啊。不应该啊。今天查了点资料,加上自己写code的体会,说下一下,作为记录吧。先概括一下:点操作符 “.”用来引用普通对象。箭头操作符“->”用来引用指针对象。 举例子说明一下:比如,我有一个对象darkray。那么我可以通过”.”来调用darkray类中中的成员变量。但是如果darkray是指针的话,就不能通过”.”来调用,而只能使用”->”...

weixin_30896763的博客 358

YOLOv5入门实践(1)——手把手带你环境配置搭建

YOLOv5入门实践第一步,手把手带你配置环境

路人贾的博客 2万+

Nvidia Driveos SDK/PDK介绍

NVIDIA DRIVEOS SDK/PDK介绍

u011803281的博客 2173

箭形图案的c++实现

题目描述 KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的箭形图案。 输入描述: 多组输入,一个整数(2~20)。 输出描述: 针对每行输入,输出用“*”组成的箭形。 示例1 输入 2 输出 * ** *** ** * #include<iostream> using namespace std; int main () { int a; while(cin>>a) { for(

m0_53300448的博客 905

【Bug已解决】Codex Desktop 报错 Computer Use 插件不可用的解决方案

方案适用场景推荐指数让 Codex 自查修复首选的快速尝试方式⭐⭐⭐⭐⭐清理插件缓存重启明确怀疑是本地缓存损坏⭐⭐⭐⭐彻底卸载重装前两个方案无效时的进阶方案⭐⭐⭐⭐检查安全软件拦截企业电脑/装有严格安全软件的环境⭐⭐⭐确认账号权限范围排除功能本身未开放的可能性⭐⭐⭐Codex Desktop 报Computer Use 插件不可用的本质是客户端内置的插件资源在本地未被正确解包或注册到插件市场索引中,而不是真的缺少安装包。优先尝试让 Codex 自身检测并修复本地插件环境。

一键难忘的博客 5980

C++重载箭头操作符的理解【转】

今天看《C++ Primer》的成员访问操作符。看重载箭头操作符部分,刚开始有点迷茫,看了两遍总算有点理解,把心得写在这,与各位分享,如果有错误欢迎指正。 箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员。左操作数为对象指针,右操作数为该对象的成员

liziyun537的专栏 694

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++ primer 箭头操作符重载心得体会

重载箭头操作符的心得体会,及示例程序。

u010235472的专栏 675

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++重载箭头操作符

转自:http://www.cppblog.com/custa/archive/2010/08/15/123491.html 今天看《C++ Primer》的成员访问操作符。看重载箭头操作符部分,刚开始有点迷茫,看了两遍总算有点理解,把心得写在这,与各位分享,如果有错误欢迎指正。 箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员。左操作数为对象指针,右操作数为

ProgrammingRing的专栏 678

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ primer中 重载箭头操作的错误 第四版 445页 14.6节

主要说明错误 1.如果 point 是一个指针,指向具有名为 action 的成员的类对象,则编译器将代码编译为调用该对象的 action 成员。 2.否则,如果 point(注:中文版误写为action) 是定义了 operator-> 操作符的类的一个对象,则 point->action 与 point.operator->()->action 相同。即,执行 point 的

xiaoshubiao的专栏 972

箭头的重载

今天看《C++ Primer》的成员访问操作符。看重载箭头操作符部分,刚开始有点迷茫,看了两遍总算有点理解,把心得写在这,与各位分享,如果有错误欢迎指正。 箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员。左操作数为对象指针,右操作数为该对象的成员。定义重载箭头操作符之后看起来就有点特别,可以用类对象的指针来调用,也可以用类对象直接调用。 重载箭头操作符,首先重载

DreamWing 979

<<C++ Primer>>中文版 重载箭头运算符的理解

在看到C++primer page445,重载箭头操作符时候,发现有点疑惑。在网上一查,原来是中文版本的错误。搞了我半天费解。现在自己整理理解后,写于此,后来人可以借鉴。 箭头运算符的重载小结: 对于该箭头运算符,其内置类型的意义为:结构体或者类类型解引用取其成员的操作符。也就说着这玩意目的就是 取结构体或者类类型对象成员的。那么重载一个比较重要的原则就是尽量保存其内置类型常规的意义。正如

YunShell 1949

c++primer——重载运算与类型转换

1、重载的运算符是具有特殊名字的函数。对于一个运算符来说,它或者是函数成员,或者至少含有一个类类型的参数。我们只能重载已有的运算符。无法重载这个四个运算符: :: .* . ?: 2、部分制定了运算对象求职顺序的运算符不该被重载,特别是,逻辑与,逻辑或、取地址和逗号运算符。原因是,这些关于运算对象求职顺序的规则无法应用到重载的运算符上,去求值顺序规则无法保留。并且&&和||的重载半...

TinnCHEN的博客 413

C++ Primer学习笔记——$14 操作符重载、函数对象及类类型转换

题记:本系列学习笔记(C++ Primer学习笔记)主要目的是讨论一些容易被大家忽略或者容易形成错误认识的内容。只适合于有了一定的C++基础的读者(至少学完一本C++教程)。  作者: tyc611, 2007-01-30    本文主要讨论C++中操作符重载、函数对象和类类型转换。   如果文中有错误或遗漏之处,敬请指出,谢谢!    重载操作符是具有特殊名称的函数:保留字operator后接需要定义的操作符符号。    大多数操作符是可重载的,但有几个操作符是不可重载的。不可重载的操作符有四个:

whycold的专栏 1086

【亲测免费】 C++ Primer第四版【中文高清扫描版】.pdf

C++ Primer第四版【中文高清扫描版】.pdf 【下载地址】CPrimer第四版中文高清扫描版.pdf分享 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会...

gitblog_06676的博客 1137

C++primer学习(14.重载运算与类型转换)

1

weixin_44897707的博客 435

十四章 札记--C++ primer 之旅

重载运算符:具有特殊名称的函数,operator + 操作符符号 ,具有返回类型和形参表。注意: 重载操作符必须具有至少一个类类型或枚举类型的操作数。大多数重载操作符可以定义为普通非成员函数或类的成员函数。作为类成员的重载函数,形参比操作数数目少1,隐含的this 形参,限定为第一个操作数。规则:一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员操作符重载和友元关系:     操作符

lsff Code World 615

C++ primer笔记——第五章 表达式

1、 C++提供了丰富的操作符,定了了操作数为内置类型时操作符的含义。此外,C++还支持操作符重载,允许自定义用于类类型时操作符的含义。 2、 对于含有操作符的表达式,其值通过对操作数做制定操作而获得。除了特殊的用法外,表达式的结果是右值,可以读取,但不允许对其进行赋值。3、 操作符的含义:该操作符执行什么类型的操作以及操作结果的类型——取决于操作数的类型。4、 C++一元操作符和二元操作符、三

uilotus 1090

C++重载运算简介

本文基于《C++ Primer(第5版)》中14章和《More Effective C++》条款7,整理而成。 其实写这篇博客之前,内心还是很忐忑的,因为,博主的水平很有限,视野比较窄,要是在理解书的过程中有了偏差,给读到这篇博客的人以错误的认识,那罪过就大了。再次声明本文仅是简介,若是有错误的地方欢迎留言指出。 个人认为运算符最重要的是:使用与内置类型一致的含义。 一、基本概念 当运...

weixin_30877755的博客 93
上一篇: c++学习书籍推荐及理由
下一篇: 毕业论文的摘要写法
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值