操作符重载之解引用与箭头操作符

流体动力学仿真软件:SU2_(1).SU2简介与安装 SU2 是一个开源的计算流体动力学(CFD)和计算结构动力学(CSD)仿真软件,由斯坦福大学的航空航天系开发。它主要用于解决流体动力学问题,包括但不限于空气动力学、热力学、化学反应流等。SU2 的特点在于其高度的灵活性和可扩展性,使其成为科研和工业领域中非常受欢迎的工具。SU2 采用有限体积法(FVM)和有限元法(FEM)进行数值求解,支持多种物理模型和求解器,如 Euler 方程、Navier-Stokes 方程、RANS 方程等。 阅读详情
箭头操作符与众不同。它可能表现得像二元操作符一样:接受一个对象和一个成员名,对对象解引用以获取成员。不管外表如何,箭头操作符不接受显式形参。这里没有第二个形参,因为 -> 的右操作数不是表达式,相反,是对应着类成员的一个标识符。没有明显可行的途径将一个标识符作为形参传递给函数,相反,由编译器处理获取成员的工作。

理解1
当这样编写时:point->action();由于优先级规则,它实际等价于编写:(point->action)();换句话说,我们想要调用的是对 point->action 求值的结果。编译器这样对该代码进行求值:
1.如果 point 是一个指针,指向具有名为 action 的成员的类对象,则编译器将代码编译为调用该对象的 action 成员。
2.否则,如果 point是定义了 operator-> 操作符的类的一个对象,则 point->action 与 point.operator->()->action相同,即执行point的operator->(),然后使用该结果重复这三步。
3.否则,代码出错。

理解2
箭头操作符,一般都有左右两部分:a->b;如何开始:由a开始,分下面两种情况:
1、a是指针,那么就是我们熟悉的,指向我们a类型的成员数据或函数“b”;到这里,就结束了!
2、a是对象,那么a必须有成员函数"operator->"(否则会报错)。那么就调用a的operator->函数。由于operator->返回的可能是指针,也可能是对象,那么就又进入了下一轮递归:是指针还是对象,走1或2,如此递归。 如何结束:不管a是指针或者对象,最终都是走到指针结束。

理解3
重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。
如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象获取指定成员。如果被指向的类型没有定义那个成员,则编译器产生一个错误。
如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符。编译器检查返回对象所属类型是否具有成员箭头,如果有,就应用那个操作符;否则,编译器产生一个错误。这个过程继续下去,直到返回一个指向带有指定成员的的对象的指针,或者返回某些其他值,在后一种情况下,代码出错。

示例
#include <iostream>

using namespace std;

class D
{
     public:
          void info(){cout << "I am D" << endl;}
};

class C
{
     public:
          void info(){cout << "I am C" << endl;}
          D* operator*(){return &m_d;}
          D* operator->(){return &m_d;}

     private:
          D m_d;
};

class B
{
     public:
          void info(){cout << "I am B" << endl;}
          C& operator*(){return m_c;}
          C& operator->(){return m_c;}
     private:
          C m_c;
};

class A
{
     public:
          void info(){cout << "I am A" << endl;}
          C* operator*(){return &m_c;}
          C* operator->(){return &m_c;}
     private:
          C m_c;
};

int main()
{
     A a;
     a->info();
     a->operator->()->info();

     B b;
     b->info();
    
     B *bp = &b;
     bp->info();
     A *ap = &a;
     ap->info();
    
     cout << endl << "deference test" << endl << endl;    
     A da;
     (*da)->info();
     B db;
     (*db)->info();
     (*db).info();
     (**db)->info();
     C dc;
     (*dc)->info();

     return 0;
}

运行结果
I am C
I am D
I am D
I am B
I am A

deference test

I am C
I am D
I am C
I am D
I am D

结果分析
箭头操作符和解引用操作符只有作用在类对象上,才会起重载作用;作用在指针上,按照原始的原生态指针的含义处理。

1、a->info();
首先,a是对象,而且有operator->,调用之,返回C*,是个指针。那么,接下来就是调用函数info,找到对应的C的成员函数。
2、a->operator->()->Print();
a调用“->”返回的C*,是个指针;那么接下来就是调用C的成员函数。后面是个operator->(),正好是C的一个成员函数。
C的operator->返回的是D*,是个指针,那么再调用对应的D的成员函数info();
即“a->operator->()->info()”中的operator->()需要看成一个C的成员函数(正好返回D*,可以调用箭头“->”)就好理解了。
3、b->info();
b是对象,调用operator->返回C对象,那么需要再次递归;C是对象,调用operator->返回D*,那么就是指针,可以走向结束:调用对应的函数info。
4、bp->info();
bp是指针,接下来就是调用函数info,找到对应的B的成员函数
5、ap->info();
ap是指针,接下来就是调用函数info,找到对应的A的成员函数

解引用分析:
6、 (*da)->info();da是A类型的对象,(*da)调用operator*返回指向C类型的指针,后同箭头操作符操作规则;
7、(*db)->info()和(*db).info();db是B的对象(*db)返回指向C类型的对象的引用,即(*db)是一个类型为C的对象,->后同箭头操作符操作规则;.操作符直接调用该对象的成员。
8、(*dc)->info();dc是C类型的对象,(*dc)调用operator*返回指向D类型的指针,后同箭头操作符操作规则;

上面的例子仅仅是为了便于理解解引用操作符和箭头操作符,并没有实用价值。在STL源码中,operator*返回对象的引用,operator->返回对象的指针;此处的对象即对应容器中的元素。
[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF 本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 阅读详情

相关推荐

京瓷扫描驱动安装_京瓷喷头拆解和供墨原理剖析

在工业喷头打印领域,京瓷喷头作为主流喷头广泛应用于喷墨行业,目前京瓷喷头市面上销售主要有两个系列:KJ4A和KJ4B。其中KJ4A系列设计是用于油性墨水,例如UV墨水,主要用在广告领域;而KJ4B设计用于水性墨水,例如活性、分散墨水等,主要用在数码印花领域。最近我们团队对京瓷喷头进行了拆解分析,本期和大家分享一下我们对京瓷喷头拆解和喷头供墨原理的研究。京瓷喷头介绍1. KJ4A系列(油性)如下图所...

weixin_39883906的博客 1672

【C++ Primer每日一刷之十二】 箭头操作符,条件操作符,sizeof操作符,逗号,优先级

5.6. 箭头操作符 C++ 语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->)。点操作符(第 1.5.2 节)用于获取类类型对象的成员:   item1.same_isbn(item2); // run thesame_isbn member of item1     如果有一个指向 Sales_item 对象的指针(或迭

poem_of_sunshine的专栏 1600

深入解析摄像头硬件接口:DVP、MIPI-CSI2与USB的技术对比与应用场景

本文深入解析了摄像头三大主流硬件接口DVP、MIPI-CSI2与USB的核心技术差异。DVP接口作为并行传输的“老兵”,成本低但带宽和抗干扰能力有限;MIPI-CSI2凭借差分串行设计成为移动高清设备的首选,具备高带宽和强抗干扰性;USB接口则依托UVC标准实现了跨平台的即插即用。文章通过对比传输方式、带宽、应用场景等关键维度,为智能硬件、嵌入式系统等领域的工程师提供了清晰的选择指南。

c7d8e的博客 514

运算符优先级,一网打尽,再也不会疑惑

运算符优先级在这里一次全部搞清楚,不再疑惑

qq_45966201的博客 2526

从翼型到湍流:用生活化案例图解空气动力学核心概念(中英双语版)

本文通过飞机机翼、F1赛车、高尔夫球等生活化案例,图解空气动力学核心概念。深入浅出地解释了攻角如何产生升力、边界层与流动分离如何影响阻力、马赫数如何划分速度世界,以及涡流与湍流的特性与应用。文章还介绍了计算流体动力学(CFD)这一现代数字风洞工具,帮助读者直观理解这些塑造现代交通与运动设计的无形之力。

metaverse5vr的博客 475

system_stm32f10x.c文件分析

配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。

Jia shuheng的博客 601

c语言优先级.和箭头,C语言运算符优先级等级口诀

圆方括号、箭头一句号,自增自减非反负、针强地址长度,乘除,加减,再移位,小等大等、等等不等,八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。其中“,”号为一个等级分段。注:“圆方括号、箭头一句号”指的是第15级的运算符。其中圆方括号很明显“()、[]”,箭头 指的是指向结构体成员运算符“->”,句号 指的是结构体成员运算符“.” ;“自增自减非反负、针强地址长度”指的是第14级的运算...

weixin_32458131的博客 1716

VS2017中调用gdal(C#版)的方法二(含gdal下载地址,配置过程,代码测试,超详细!!)

VS2017中gdal(C#)版的配置与测试 上次记录了直接在VS2017中下载并应用gdal的方法,这次来记录一下网上下载的安装包配置与测试的方法。 一、环境、版本及下载地址 win10,vs2017社区版,gdal2.4.4 还是像之前在Unity中应用gdal一样,最好是下载已经编译好的C#版的gdal,不然自己配置真的很容易出错,我就是这样的,下面提供不同版本的gdal下载地址: 1.GDAL2.4.4(C#版、64位): https://download.youkuaiyun.com/download/che

chengbaola的博客 1365

C++知识点43——解引用运算符和箭头运算符的重载及智能指针类的实现

一、概念、 在自定义行为类似指针的类时,需要重载*和->。C++中的智能指针就重载了这两个运算符。->必须是成员函数,*也应该是成员函数。与内置类型保持一致,这两个函数通常都是const的。以为*和->通常不会也不应该改变对象的状态 *运算符的返回值无硬性规则,但是通常都是一个类型的引用 ->运算符的返回值必须是一个类的指针(或者重载了operator->的类的对象)。因为->的作用就是通过对象的指针获取对象的成员 二、示例 通过实现一个智能指针来熟悉这两.

Master Cui的博客 1500

Ansys 19 Mechanical 流体密封分析

start point是一个特殊的概念,在仿真中ansys将从start point开始搜索会发生流体渗漏的点,可以简单理解为从start point开始,向四周逐个节点比较节点上的接触压紧力与流体压力,如果流体压力大于压紧力,则发生渗漏。事实上此处的最后一个参数是指定start point类型的,为1代表这是一个“open”的start point。在通常情况下,如果不人为指定start point,程序会自动寻找指定流体压力面的“边界”,对于二维情况,就是曲线的两个端点,对于三维情况就是曲面的边线。

Dio980的博客 1530

CS231n+assignment2(一)

cs231n作业二详解+代码

qq_56551150的博客 2411

【C++】运算符重载/函数的返回值为解引用

函数的返回值为解引用?

weixin_52958292的博客 1657

【时时三省】vector cast 常见错误解决/vcast常见错误解决

介绍在使用 vector cast/vcast 软件的过程中,遇到的异常问题。其它异常可以私信解决(购买专栏的前提下)。

时时三省的博客 448

C++解引用与箭头操作符重载

//class HasPtr class HasPtr { public: //default constructor HasPtr():p(new int) {} //constructor HasPtr(int * i):p(i) {} //copy control HasPtr(cons

所有内容都已迁移到 https://huqijun.org 546

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

关于解引用*和箭头操作符->的重载

这里以一个智能指针类为例,智能指针所指为一个对象。 而事实上,STL迭代器的开发均需要重载这两个操作符,上一篇文章分析STL 迭代器中除了要用到template技巧外,还需要重载技巧 #include<iostream> using namespace std; class Screen { public: friend ostream& operator<<(ostream&os, Screen &s); int action(){

qq_27898413的博客 255

老版QQ原生表情gif动态

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

解引用和箭头操作符

#include #include "string.h" #include "pointer.h" using namespace std; int main () { String s("xiaocui"); s.display(); String *ps = &s; // 这个是普通的指针,普通的指针容易产生野指针, ps->display(); try { Poin

qq_31248551的博客 991

C++重载箭头操作符

2.ScopedPtr类的构造函数和析构函数(ScopedPtr析构时对实际对象进行自动删除)番外知识点:利用箭头操作符获取成员变量的偏移量(就是内存对齐的偏移量)看cherno的c++ 第46集。1.指针与解引用,点跟箭头的使用。

qq_50877617的博客 188

STL运用的C++技术(5)——重载操作符

STL是C++标准库的重要组成部分之一,它不仅是一个可复用的组件库,更是一个包含算法与数据结构的软件框架,同时也是C++泛型编程的很好例子。STL中运用了许多C++的高级技术。本文介绍重载操作符。主要参考了《C++ Primer》和《STL源码剖析》。        重载操作符是具有特殊名称的函数:保留了operator后接需定义的操作符符号。这是《C++ Primer》中的定义。在STL中

郑亚帅 490

第14章 重载操作符与转换(5)

14.6 成员访问操作符 箭头操作符必须定义为类成员函数。解引用操作符不要求定义为成员,但将它作为成员一般也是正确的。 1. 构建更安全的指针 class ScrPtr { friend class FooPtr; size_t use; Foo *f; ScrPtr(Foo *foo):f(foo),use(1){} ~ScrPtr() { delete f; } };

296

c++重载操作符

#include <iostream> using namespace std; class Screen{ }; class CheckedPtr{ public: // 没有默认构造函数 CheckedPtr(Screen* b,Screen* e):beg(b),end(e),curr(b){} //解引用操作符 * Scree...

weixin_30719711的博客 68

STL运用的C++技术(4)---函数重载

STL是C++标准库的重要组成部分之一,它不仅是一个可复用的组件库,更是一个包含算法与数据结构的软件框架,同时也是C++泛型编程的很好例子。STL中运用了许多C++的高级技术。本文介绍重载操作符。主要参考了《C++ Primer》和《STL源码剖析》。        重载操作符是具有特殊名称的函数:保留了operator后接需定义的操作符符号。这是《C++ Primer》中的定义。在STL中

lvfengchang1220的专栏 391

c++学习-oop-重载成员访问操作符

main.cpp /* Date: 12/03/21 16:01 Description: 重载成员访问操作符 成员访问操作符 解引用操作符:* 用于指针 箭头操作符:-> 用于对象 复习 管理指针成员 定义智能指针类 class Pointer ----> class String */ #include<iostream> #include "string.h" #include "pointer.h" using namespace std

flamesfather的博客 154

c++ premier -- 复制控制与重载操作符

第十三、十四章主要讲了复制控制与操作符重载的相关内容。同时也提供了一些例子说明在某些情况下必须使用以及如何使用自定义的复制控制。 复制构造函数是一种特殊的构造函数,它接受该类类型的引用作为其形参。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数,当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数。 析构函数是构造函数的互补,当对象超出作用域

wolenski的专栏 641

C++:箭头操作符

【代码】C++:箭头操作符。

2201_75903640的博客 466
上一篇: 自旋锁详解
下一篇: RTTI和类型转换
IT_Linux
博客等级 码龄14年 31粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值