概述
之前对成员变量的分布进行了整理,今天就对成员函数进行整理。

1、非静态成员函数
C++的设计准则之一就是:非静态成员函数至少和一般的非成员函数的执行效率相同。

为了实现上衣准则,编译器会对非静态成员函数进行改进,先看下面的例子:

float func(const Point3d* _this) { .... }

float Point3d::func() const { .... }
1
2
3
编译器对会Point3d::func()做下面三个步骤的操作:

1、改写函数func以安插一个额外的参数到成员函数中,使得此类对象可以被使用,这个额外的参数被称为this指针。如下:

Point3d::func( Point3d*www.mhylpt.com  const this )
1
如果成员函数也是const,则为:

Point3d::func(www.meiwanyule.cn const Point3d* const this )
1
2、将每一个对 “非静态成员的存取操作” 改为经由 this 指针来存取。

return sqrt( this->x * this->x + this->y * this->www.michenggw.com y + this->z * this->z )
1
3、将 成员函数 重新编写成一个外部函数,此函数独一无二。这个咱前面整理C++函数编码规则时讲过了,大概的意思是分为两步:第一步是区分不同类中的同名函数,在函数后加类名信息。第二部是为了类中的重载函数,再在后面加参数信息。

2、静态成员函数
静态成员函数相当于只执行非静态成员函数中的第三步。因为它不属于单个对象,所以没有this指针的概念。由于没有this指针所以有以下特性:

不能够直接存取其class中的非静态成员
不能够声明为const、virtual、volatile
不是必须由类对象进行调用
3、虚函数
之前整理过C++ 虚函数原理,对于虚函数的调用可以分为三个过程:

编译器产生虚函数表,定义类对象时,对象中产生vptr,指向虚函数表。
虚函数的调用,会从虚函数表中检索出索引。
添加额外的参数,跟非静态成员函数一样,这个参数是this指针。
由于存在虚拟机制,所以显示的调用虚函数是比较有效率的,但是这样会丧失掉多态。

4、函数调用效率
对于静态成员函数和非静态成员函数,执行效率和非成员函数是一样。

对于虚函数,因为增加了多态机制,需要动态检索,所以效率会降低。

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
《深度探索 C++对象模型》
---------------------

C++ 类中成员函数分析的更多相关文章

  1. 类中成员函数与数据成员private/pubic/protected

    类中成员函数与数据成员private/pubic/protected

  2. VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

    一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...

  3. 在类的成员函数中调用delete this

    最近面试的时候被问到一个问题是,在C++中,能否在类的成员函数中调用delete this,后来网上查了一下资料,关于这个问题说得比较好的有http://blog.sina.com.cn/s/blog ...

  4. [转载]能不能同时用static和const修饰类的成员函数?

    题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量).请问:能不能同时用static和con ...

  5. (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

    昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"< ...

  6. C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...

  7. C++类中的函数重载

    1,本课程最初阶段就学习了函数重载,但是那时研究目标仅限于全局函数,到目前 为止我们学习了三种函数: 1,全局函数: 2,普通成员函数: 3,静态成员函数: 这三种不同类型的函数之间是否可以构成重载, ...

  8. C++类的成员函数使用的一些小总结

    From: http://blog.csdn.net/xiayefanxing/article/details/7607506 这一阵做项目代码开发的时候,用到了在一个C++文件中使用另一个类的成员函 ...

  9. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

随机推荐

  1. 绝地求生大逃杀BE启动失败,应用程序无法正常启动

    今日更新绝地求生大逃杀后部分客户反馈绝地求生点击启动提示BE安装,应用程序无法启动 问题原因:经过排查发现,客户开启过超级工作站运行过游戏,在系统镜像包中保留了旧版的BE服务,致使新版BE无法安装,冲 ...

  2. Qt-第一个QML程序-2-关键代码分析,TEXT,Image,Mouseare

    qml语言开始写的时候有点不习惯,后面用的多了感觉很好,很顺手,用于快速搭建项目界面,真的很好. 目前用到的还是比较简单的 隐藏标题栏,而依附任务栏 flags: Qt.Window | Qt.Fra ...

  3. 接口测试工具postman(五)批量执行测试用例

    1.准备好测试用例及相关数据 2.点击Run按钮 3.选择运行collection或者folder 4.运行完成

  4. Java Swing学习笔记——创建JFrame

    创建显示一个空JFrame import javax.swing.JFrame; public class JFrameDemo extends JFrame{ public JFrameDemo() ...

  5. C 数数位 while循环

    #include <stdio.h> int main(int argc, char **argv) { //定义两个变量  x n 把n初始化 int x; int n=0; //输入x ...

  6. lintcode407 加一

    加一 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照大小进行排列,最大的数在列表的最前面. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1,2,3] ...

  7. bson文件的切分

    描述 最近遇到问题需要将较大的bson文件(MongoDB导出的二进制json文件)按文档(记录)进行切分,网上这方面的资料实在太少,弄了一天多终于达到了基本要求(还不知道有没有BUG) 代码 pac ...

  8. win7下本地运行spark以及spark.sql.warehouse.dir设置

    SparkSession spark = SparkSession .builder() .master("local[*]") .enableHiveSupport() .con ...

  9. 开关灯问题(C++)

    [问题描述] 假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部处于开启状态:有 M 个人(M 为不大于 N 的正整数)也从 1 到 M 依次编号.第一个 ...

  10. 开源自动驾驶仿真平台 AirSim (1) - Unreal Engine

    AirSim 官方Github: https://github.com/Microsoft/AirSim AirSim 是微软的开源自动驾驶仿真平台(其实它还能做很多事情,这里主要用于自动驾驶仿真研究 ...