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++对象模型》
---------------------

原文地址:https://www.cnblogs.com/qwangxiao/p/10199125.html

时间: 2024-11-04 19:42:07

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

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

在类的成员函数中能不能调用delete this?答案是肯定的,能调用,而且很多老一点的库都有这种代码.假设这个成员函数名字叫release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法么?答案仍然是肯定 的,调用release之后还能调用其他的方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数.说到这里,相信大家都能明白为什么会这样 了. 根本原因在于delete操作符的功能和类对象的

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

前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. VB中默认是没有鼠标移出事件响应的,而这个事件其实在项目开发中,实用性很强,很多时候需要在鼠标移出窗体或控件时做些事情:没有这个事件会感觉很费力: 今天我所说的实际案例就是,在窗体上,设计一个SplitterBar控件,窗体的最终用户使用这个控件可以在运行程序时任意调整其内部控件大小. 我在第二篇参考博文作者开发的

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

昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"<<endl; } virtual void printB() { cout<<"printB"<<endl; } }; main函数调用: D *d=NULL; d->printA(); d->printB(); 输出结果是? 当时想的是对象d直

类的成员函数指针(比較深入)

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块解说的比較深入具体 推荐阅读 ///////////////////////////////////////////////// 先看这样一段代码 class test {    public:       test(int i){ m_i=i;}       test(){} void hello()       {        

类中的函数重载

函数重载回顾: - 函数重载的本质为相互独立的不同函数; -C++通过函数名和函数参数确定函数调用. -无法直接通过函数名得到重载函数的入口地址. -函数重载必然发生在同一作用域. 类中的重载: -构造函数的重载; -普通成员函数的重载 -静态成员函数的重载 Question: 全局函数,普通成员函数以及静态成员函数之间是否可以构成重载. 万变不离其宗: 1.重载函数的本质为多个不同的函数. 2,函数名和参数列表是唯一的标识符; 3.函数重载必然发生在同一作用域. 深度的意义: -通过函数名对函

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

From: http://blog.csdn.net/xiayefanxing/article/details/7607506 这一阵做项目代码开发的时候,用到了在一个C++文件中使用另一个类的成员函数的问题,做个小总结. 其中有些是网上搜索的资料,因为比较分散就不一一给出出处了,请作者见谅. 1.C++如何在一个类的成员函数中调用另一个类的成员函数? 假设你想在类A里调用类B的函数int f(x),两种办法: (1)class A::B 也就是说将B定义为A的父类, 这样你就可以自然的在A里面

C++类的成员函数的指针和mem_fun适配器的用法

一.普通函数指针 我们先来看一个最简单的函数: void fool(int a) { cout << a<< endl; } 那么它的函数指针类型为: void (*) (int) 我们可以这样测试: void (*pFunc)(int) = &foo;//这里pFunc是个指针 pFunc(123); 这样就会打印出整数123:为了简化,我们可以使用typedef: typedef void (*pFunc)(int); 这里我们要说明一下: 这里的pFunc是 返回值为

类的成员函数指针和mem_fun适配器的用法

先来看一个最简单的函数: void foo(int a) { cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: void (*pFunc)(int) = &foo; pFunc(123); 这就是函数指针的基本使用.   类的成员函数   那么,对于类的成员函数,函数指针有什么不同呢? 我们观察下面的类: class Foo { public: //void (Foo::*)(int) void foo(int

判断在类中某个函数(也可以是变量或类型)是否存在

一,判断在类中某个函数(也可以是变量或类型)是否存在 template<typename T> struct xxxx_detector { template<typename P,void (P::*)(void)> struct detector{}; template<typename P> static char func(detector<P,&P::init>*); template<typename P> static lo