Cpp 对象模型探索 / 类普通成员函数的调用方式
C++设计时有一个要求,类普通成员函数的调用性能要和全局函数差不多。所以编译器在处理类的普通成员函数的宗旨是将其当作全局函数来处理。
为了达到上述目的,编译器会对类的普通成员函数进行如下操作:
在函数形参中第一位插入类对象的 this 指针。
修改函数名称,使之与类名等信息挂钩。这样也就解决了既然将普通成员函数当作全局函数,但是各个类中有重名函数的情况。
栗子:
class A
{
public:void func(){}
};int main()
{A a;a.func();return 0;
}
执行 nm test.o > test.txt 指令,在生成的文件中会找到如下标识:
00000000000006a8 W _ZN1A4funcEv
该标识就是编译器眼中对函数 func 的认识,即:重命名。
综上,编译器通过在类普通成员函数中插入类对象的 this 指针和重命名函数名的方式来重置普通成员函数。
(SAW:Game Over!)
Cpp 对象模型探索 / 类普通成员函数的调用方式相关推荐
- Cpp 对象模型探索 / 类引入虚函数有哪些成本?
编译时会为类对象引入虚函数表. 类对象中会产生虚函数表指针 vptr,用于指向虚函数表. 在对象的构造函数中插入向 vptr 赋值虚函数表的首地址的代码. 若是多重继承,每个父类均有虚函数,那么子类会 ...
- Cpp 对象模型探索 / 类静态成员函数的调用方式
一.普通静态成员函数的调用方法 栗子: class CA { public:static void func() {} };int main() {CA A;A.func();CA::func();r ...
- C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销
一.类成员函数 class test { public:void myfunc(){}virtual void vfunc() {}static void sfunc() {} };void myfu ...
- 在一个类的成员函数中调用另一个类的成员函数
假设你想在类A里调用类B的函数int f(x),两种办法: 1.class A::B 也就是说将B定义为A的父类, 这样你就可以自然的在A里面用f(x)了 2.class A { B B_ins; ...
- C++类static成员函数的调用
class中的静态成员函数作用再整个类的内部,对应类的所有实例是共享静态成员函数的,在调用静态成员函数的时候跟调用非静态成员函数是有区别的.另外,静态成员函数只能访问对应类内部的静态数据成员,否则会出 ...
- Cpp 对象模型探索 / 对象访问成员变量的原理
一.栗子 1.源码 #include <iostream> #include <stdio.h>class Base { public:Base() { std::cout & ...
- Cpp 对象模型探索 / 多态的本质
普通成员函数的调用方式是直接通过编译期间确定的函数地址来调用. 多态是通过查询对象的虚函数表来获取虚函数的地址.因为像工厂模式这样,并不能在编译期间知道基类指向的是哪个子类,也就导致了不能在编译期间获 ...
- 怎么将一个类的成员函数作为指针传递给另一个类的成员函数
今天帮同学解决了一个问题,怎么把一个类的成员函数作为指针传递给另一个类的成员函数. 以前只接触过C语言中的函数指针: #include <iostream.h> void add(int ...
- C++ 类的成员函数
C++ 类的成员函数 一.普通成员函数 1.普通成员函数的声明 2.普通成员函数的定义方式 3.普通成员函数的调用方式 二.构造函数 1.构造函数的分类 2.构造函数的特点 3.构造函数的作用 4.构 ...
最新文章
- Matlab与线性代数--矩阵的正交分解
- 技术非中立,语言非同质:机器翻译正被用于维护文化障碍
- centos 安装 redmine 2.6.0.stable
- intellij-IDE运行Java程序报错:java: -source 1.5 中不支持 lambda 表达式 有用
- leetcode684. 冗余连接(并查集)
- C++简易复数类的实现
- *第四周*数据结构实践项目一【创建单链表】
- linux一个数据页多少,复习——Linux
- 固高运动控制卡的使用 2 关于IO的访问以及调用(C#版)
- PHP网站开发的流程步骤
- SAS Visual Analytics(VA)安装教程
- Python关键字查询
- 关于互联网金融的安全、监管
- html如何缩进对齐,CSS:文本样式(缩进/对齐/字符间隔/文本装饰/空白格处理)_html/css_WEB-ITnose...
- speedoffice(Excel)如何全选表格
- 2019大疆秋招面经(后台开发录用)
- 2013-08-17 PMP错题记录(第七章)
- Python flask入门
- 笔记:腾讯云服务器的使用
- Python爬虫之初识简介以及舆情系统简介【爬虫篇一】
热门文章
- angular之表单
- [考试]20150528
- 用python的matplotlib画标准正态曲线
- 在Synaptic Package Manager 加载USB 接口的CD-ROM
- 无人值守网络安装Linux系统
- 经典mysql语句_经典MYSQL语句
- 前端月趋势榜:4 月最热门的 20 个前端开源项目 - 2104
- npm教程:如何查看TypeScript版本、卸载TypeScript和安装TypeScript
- pyspark subtract代码示例
- cordova报错:Could not find an installed version of Gradle either in Android Studio, or on your system