C++对象模型(19)-- 函数语义学:成员函数

news2024/9/20 22:29:45

1、普通成员函数的调用

1.1 调用方式的转换

为了提高普通成员函数的调用效率,在C++中,对普通成员函数的调用,会转换成对全局函数的调用。

假如有下面所示的成员函数:

class Test {
public:
    int m_i;

    int func(int a) {
        m_i += a;

        return m_i;
    }
};

在编译时会经历下面几个步骤:

(1)把对象的首地址作为参数,传递给函数。

int func(Test *const this, int a) {}

(2)对非静态成员变量的调用,改成通过this指针来调用。

int func(Test *const this, int a) {
    this->m_i += a;
    return this->m_i;     
}

(3)对函数名进行name mangling操作,通过函数名和其参数类型生成唯一标识符,来区分不同的函数。

int _ZN4Test4funcEi(Test *const this, int a){}

1.2 代码演示

(1)

在main()函数中加入调用函数func()的代码:

int main() {
    Test test;
    int ret = test.func(6);
}

然后把断点设在:int ret = test.func(6); 运行程序后,查看反汇编代码(VS2019):

简单分析下汇编语言的意思:

(1)push 6:把参数6入栈。

(2)lea ecx, [test]:把test写入ecx。

这2行其实是参数传递。

(3)call Test::func(05C12D0h):调用函数func。

(4)move dword ptr [ret], eax:把eax的值赋给ret。

从这些代码可以看到,函数的调用流程可分成3个阶段:参数传递、调用函数call、处理返回值。

在反汇编的“地址(A)”窗口输入函数func的地址:05C12D0h,回车后查看函数func的反汇编代码:

这段汇编的细节不去深究,但我们可以看到有[this]字样,可以知道函数在具体执行时用到了this指针。

所以对func函数的调用转换可以用下图表示:

如果用指针方式调用成员函数:

Test* pTest;
int ret = pTest->func(6);

则对func函数的调用转换是这样的:

(2)把代码在linux上编译后,用nm命令查看可执行文件的信息。

linux下编译:g++ ch19.cpp -o ch19

用nm命令查看可执行文件:nm ch19

可以看到,func函数被转换成了_ZN4Test4funcEi。

2、静态成员函数的调用

对于静态成员函数的调用,无论用对象名来调用,还是用对象指针来调用,效果都是一样的,都会被编译器转换成一般的针对普通函数(非成员函数)的调用形式。

静态成员函数是跟着类走的,所有调用静态成员函数时编译器是不会插入this作为形参的。

假如类Test有一个static成员函数:

static void stfunc() { }

则可以用下面的方法来调用此静态成员函数:

Test test;
test.stfunc();

Test::stfunc();

Test* pTest;
pTest->stfunc();

静态成员函数有以下特点:

(1)静态成员函数没有this指针,这点最重要。

(2)无法直接存取类中普通的非静态成员变量,因为非静态成员变量是通过this指针来操作的。

(3)静态成员函数不能在后面使用const,也不能设置为virtual。

(4)可以用类对象调用,但不非一定要用类对象调用。

(5)静态成员函数等同于非成员函数,需要提供回调函数的这种场合,可以将静态成员函数作为回调函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

划片机:半导体芯片是如何封装的?

半导体芯片的封装是指将芯片内部的电路通过引脚、导线、焊盘等连接起来,并保护芯片免受外部环境的影响,同时满足外部电路的连接需求。以下是半导体芯片封装的常见步骤: 1. 减薄:将晶圆研磨减薄,以便于后续的划片操作。…

2023京东双十一活动今晚20点开始?京东双十一时间安排和满减规则

2023京东双十一活动时间节点! 京东双十一红包,同样是每天可以领取,10月23日开始,面额最高11111元。 京东app搜索【红包到手210】即可领取双11红包 (数字要带上) 2023年京东双11整体将围绕六个时期展开: 1、第一波&…

如何处理前端多语言支持?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

最成功的国产手机得到央视认可,自研系统走向国际挑战谷歌

随着美国对中国企业不断采取措施,中国手机企业都在努力自主创新,日前又一家国产手机自研操作系统被网友质疑,不过央视却肯定了这家企业在创新方面的优势,赞扬了它带动中国制造走向国际市场。 央视给予赞誉的这家企业就是小米&…

QSlider 类使用教程

文章目录 1、简介2 、公共类型3、属性4、functions4.1、访问属性相关 function4.2、公共槽4.3、Signal4.4、其他方法 5、设置样式 QT 官方文档参考地址:https://doc.qt.io/qt-5/qslider.html 1、简介 QSlider是垂直或水平滑块条控件,最常见的应用就是视…

摩尔信使MThings的报文管理功能

设备通信过程中,通道报文是关键调试信息。为了高效地辅助调试运维过程,摩尔信使MThings提供报文记录功能,支持丰富且友好的方法进行报文管理,包括:收发颜色标记、异常识别、通道过滤、支持Modbus全系列; 查…

springboot项目多数据源导致事务报错问题

springboot项目多数据源导致事务报错问题 序言报错日志报错原因解决办法序言 序言 之前有一篇讲了如何使用多数据源动态配置,这里遇到的一个问题和大家分享,在使用多数据源时,对数据进行更新和插入避免不了使用事务,使用多数据源…

推荐系统:从经典模型到深度学习,你需要掌握什么?

文章目录 🌟 协同过滤:最经典的推荐模型,我们应该掌握什么?🌟 深度学习革命:深度学习推荐模型发展的整体脉络是怎样的?🌟 TensorFlow入门和环境配置🌟 模型特征、训练样本…

Delphi 编程实现拖动排序并输出到文档

介绍:实现拖动排序功能,并将排序后的内容输出到文档中。我们将使用 Delphi 的组件来创建一个界面,其中包括一个 Memo 控件用于输入内容,一个 ListBox 控件用于显示排序后的内容,并且提供按钮来触发排序和输出操作。 代…

万宾科技智能井盖传感器怎么使用?

时代在进步,科技在更新,人们身边的万事万物都在随着时代的脚步不断的前进。各种各样高科技技术在城市基础设施建设的过程中得到应用,很多智能产品不仅施工方便,而且可以向政府部门提供精准的数据,提高了相关管理人员的…

7.(vue3.x+vite)组件间通信方式之vuex

前端技术社区总目录(订阅之前请先查看该博客) 示例效果: Vuex 简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。 (1)Vuex 的状态存储是…

居民小区电动汽车有序充电策略研究

摘 要:针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题,提出一种采用延迟充电的电动汽车有序充电控制策略,并在分析国内外电动汽车有序充电的研究现状后,设计了居民小区电动汽车有序充电策略的总体框架。…

CAN总线测试——CAN一致性之物理层

CAN一致性物理层测试项 1.最小通讯电压测试2.最大通讯电压测试3.显性位/隐性位输出电压测试4.信号跳变沿测试5. 地偏移6. 终端电阻 1.最小通讯电压测试 2.最大通讯电压测试 3.显性位/隐性位输出电压测试 4.信号跳变沿测试 5. 地偏移 6. 终端电阻

基于51单片机DS18B20温度测量仿真设计(源码+仿真+报告+讲解)

本设计 基于51单片机DS18B20温度测量仿真设计 1 功能说明:2 讲解视频:3 仿真电路:4 程序:5 设计报告:6 资料清单(提供资料清单所有文件): 基于51单片机DS18B20温度测量仿真设计&…

vscode类似GitHub Copilot的插件推荐

由于GitHub Copilot前段时间学生认证的账号掉了很多,某宝激活也是价格翻了几倍,而却,拿来用一天就掉线,可以试试同类免费的插件哦。 例如:TabNine,下载插件后,他会提示你登录,直接登…

ASP.NET Core 中的五种过滤器

ASP.NET Core 中的五种过滤器 前言一、过滤器介绍1.五种过滤器(1)IActionFilter(2)IAuthorizationFilter(3)IExceptionFilter(4)IResourceFilter(5)IResultFi…

Linux常用命令——clock命令

在线Linux命令查询工具 clock 用于调整 RTC 时间。 补充说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间,执行这项指令可以显示现在时刻,调整硬件时钟的时间,将系统时间设成与硬件时钟之时间一致,或是把系统时间…

【刷题-牛客】出栈、入栈的顺序匹配 (代码+动态演示)

【刷题-牛客】出栈、入栈的顺序匹配 (代码动态演示) 文章目录 【刷题-牛客】出栈、入栈的顺序匹配 (代码动态演示) 解题思路 动图演示完整代码多组测试 💗题目描述 💗: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个…

C++标准模板(STL)- 类型支持 (运行时类型识别,bad_typeid,bad_cast )

运行时类型识别 定义于头文件 <typeinfo> 当 typeid 表达式中的实参为空值时抛出的异常 std::bad_typeid class bad_typeid : public std::exception; 此类型的异常在应用 typeid 运算符到多态类型的空指针值时抛出。 成员函数 (构造函数) 构造新的 bad_typeid 对象 (…

如何正确维护实验室超声波清洗机

实验室一直被视作一个严谨且严肃的场所&#xff0c;在其中所做的试验都需要遵照一定流程&#xff0c;所用的设备也经过了细致化挑选&#xff0c;例如实验室超声波清洗机&#xff0c;其性能远强于普通类别的清洗机。专门负责采购的实验室人员&#xff0c;通常会对质量优服务好的…