C++ 类中成员函数分析
概述
之前对成员变量的分布进行了整理,今天就对成员函数进行整理。
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++ 类中成员函数分析的更多相关文章
- 类中成员函数与数据成员private/pubic/protected
类中成员函数与数据成员private/pubic/protected
- VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)
一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...
- 在类的成员函数中调用delete this
最近面试的时候被问到一个问题是,在C++中,能否在类的成员函数中调用delete this,后来网上查了一下资料,关于这个问题说得比较好的有http://blog.sina.com.cn/s/blog ...
- [转载]能不能同时用static和const修饰类的成员函数?
题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量).请问:能不能同时用static和con ...
- (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"< ...
- C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...
- C++类中的函数重载
1,本课程最初阶段就学习了函数重载,但是那时研究目标仅限于全局函数,到目前 为止我们学习了三种函数: 1,全局函数: 2,普通成员函数: 3,静态成员函数: 这三种不同类型的函数之间是否可以构成重载, ...
- C++类的成员函数使用的一些小总结
From: http://blog.csdn.net/xiayefanxing/article/details/7607506 这一阵做项目代码开发的时候,用到了在一个C++文件中使用另一个类的成员函 ...
- C++ 类的成员函数指针 ( function/bind )
这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...
随机推荐
- spring源码-事件&监听3.6
一.spring中的发布与监听模式,是我们最常用的一种观察者模式.spring在其中做了很多优化,目的就是让用户更好的使用事件与监听的过程. 二.常用的事件与监听中涉及到的接口和类为:Applicat ...
- What is the "internal" interface and port for on Openvswitch?
转:https://ask.openstack.org/en/question/4276/what-is-the-internal-interface-and-port-for-on-openvswi ...
- 「日常训练」Woodcutters(Codeforces Round 303 Div.2 C)
这题惨遭被卡..卡了一个小时,太真实了. 题意与分析 (Codeforces 545C) 题意:给定\(n\)棵树,在\(x\)位置,高为\(h\),然后可以左倒右倒,然后倒下去会占据\([x-h,x ...
- 汽车VIN码,车架号,移动端,服务器端OCR识别 技术公司
很多人在购买车辆的时候,只关注性能.外观.内饰等,其实真正的内行是首先看车辆的VIN码,也叫车架号码. VIN码(车架号码)是一辆车的唯一身份证明,一般在车辆的挡风玻璃处,有的在车辆防火墙上,或B柱铭 ...
- Java开发工程师(Web方向) - 02.Servlet技术 - 期末考试
Servlet课程考试 Servlet课程考试 Servlet课程考试 总分:55分 限定时间:120分钟 进入考试 答案已成功提交!请耐心等待成绩公布 Servlet课程考试: 1(12分) 简单谈 ...
- 解析Java中final关键字的各种用法
首先,我们可以从字面上理解一下final这个英文单词的中文含义:“最后的,最终的; 决定性的; 不可更改的:”.显然,final关键词如果用中文来解释,“不可更改的”更为合适.当你在编写程序,可能会遇 ...
- 【转】VSstudio中的一些宏
说明 $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置. $(References) 以分号分隔的引用列表被 ...
- 几个常见移动平台浏览器的User-Agent
之前介绍的手机站跳转url的一片文稿中提到,依据User Agent判断终端的方法.(文章地址:http://www.cnblogs.com/dereksunok/p/3664169.html ) 若 ...
- CSS 之 选择器
CSS的常见选择器 一.简单选择器 Simple Selectors 选择器 含义 * 通用元素选择器,匹配任何元素 E 标签选择器,匹配所有使用E标签的元素 .info class选择器,匹配所有c ...
- Linux内核设计笔记13——虚拟文件系统
虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...