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 Boot中使用缓存
Spring Boot中使用缓存 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一. 原始的使 ...
- 你需要掌握的http知识
作为一名前端er,http是我们必须要掌握的,那么我们到底需要掌握哪些东西呢 一.基础知识 这里我们介绍与http相关的TCP.IP.DNS.url.uri 1.IP IP地址是我们很熟悉的东西,最常 ...
- VIN码识别,车架号识别,OCR扫描工具
近年二手车交易市场火爆,对二手车估值需要了详细解二手车的历史状况,车架号(VIN码)是车辆唯一的身份标识,也是了解二手车车况的入口,车商和二手车平台会频繁的进行车况查询,VIN码扫描识别技术给车辆估值 ...
- Linux命令应用大词典-第16章 归档和压缩
16.1 tar:进行归档和压缩 16.2 gzip:压缩或解压缩gzip文件 16.3 gunzip:解压缩gzip文件 16.4 zcmp:比较gzip压缩文件 16.5 zdiff:比较gzip ...
- pyhon文件操作典型代码实现(非常经典!)
1. 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: 实现代码: import os all_files = os.listdir(os.chdir("D:\\" ...
- 1. 两数之和【Leetcode中国,by java】
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- python简单循环生成器
import time #循环生成器 def traversal_list(alist, i): while True: length = len(alist) i = i%(length) yiel ...
- 洛谷P1068 分数线划定:sort结构体排序+贪心
题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试. 面试分数线根据计划录取人数的150%划定, ...
- 56[LeetCode] .Merge Intervals
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...
- HDU 4169 Wealthy Family(树形DP)
Problem Description While studying the history of royal families, you want to know how wealthy each ...