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

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. springboot整合kafka应用

    1.kafka在消息传递的使用非常普遍,相对于activemq来说kafka的分布式管理和使用更加灵活. 2.activemq的搭建和使用可以参考: activemq搭建和springmvc的整合:h ...

  2. SpringBoot学习:获取yml和properties配置文件的内容

    项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...

  3. VueJs 学习笔记

    VueJs学习笔记 参考资料:https://cn.vuejs.org/ 特效库:TweenJS(补间动画库)  VelocityJS(轻量级JS动画库) Animate.css(CSS预设动画库) ...

  4. create-react-app创建react项目 css模块化处理

    用的css预处理器用sass,其他大同小异. 用create-react-app创建项目,执行npm run eject弹出配置文件(此操作不可逆): 配置sass,用的最新的CRA,webpack4 ...

  5. 关联分析FPGrowth算法在JavaWeb项目中的应用

    关联分析(关联挖掘)是指在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品之 ...

  6. 180606-Linux下jdk中文乱码问题解决

    文章链接:https://liuyueyi.github.io/hexblog/2018/06/06/180606-Linux下jdk中文乱码问题解决/ linux下jdk中文乱码问题解决 之前遇到过 ...

  7. MySQL☞关联查询

    关联查询:所需要的数据来源于多张表,通过表的连接查询(关联查询)来查询多张表中的数据 格式: select 别名1 . */列名 , 别名2 . */列名 from 表名1  别名1 , 表名2  别 ...

  8. 【SpringCloud】 第九篇: 服务链路追踪(Spring Cloud Sleuth)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  9. python操作符及其循环语句(非常全)

    //2018.10.14 1. Windows + R可以直接进行运行cmd 2. Random.randint(a,b):产生a-b的任意一个整数,在IDLE里面运行时需要注意在前面写好调用impo ...

  10. mpvue笔记

    简介: mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,为小程序开发引入 Vue.js 开发体验 我觉得就像scss一样,写的时候方便,最后还是要转成css文件 搭建 ...