Inside The C++ Object Model(四)
============================================================================
4-1. Member 的各种调用方式
静态成员函数(static member functions,不属于对象,没有this指针)不能直接存取Nonstatic数据;同时不能被声明为const(const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数——this指针由原来的Class* const变为const Class* const类型,使得在该成员函数内不能修改成员属性,除非该属性被mutable修饰)。
数目各种调用方式
(1)Nonstatic Member Functions(非静态成员函数)




名称的特殊处理
编译器会把参数和函数名称编码在一起(函数特征标:函数名称+参数数目+参数类型),但是如果“返回类型”声明错误,就没办法检查出来。
(2)Virtual Member Functions(虚拟成员函数)

注:“经由一个class object调用一个Virtual function”,这种操作应该总是被编译器像对待一般的Nonstatic member function一样地加以决议。所以如下调用操作:
// Point3d obj
obj.normalize();
会被编译器转换为:
// 经由obj调用的函数实体只可以是Point3d::normalize()
normalize_7Point3dFv(&obj);
(3)Static Member Functions(静态成员函数)

图片4-1-6;

图片4-1-7;

图片4-1-8;
============================================================================
4-2. Virtual Member functions(虚拟成员函数)
(1)我们已经知道Virtual function的一般实现模型:每一个class 有一个virtual table,内含该class 之中有作用的Virtual function 地址,然后每个object有一个vptr,指向Virtual table的所在。

图片4-2-1;

图片4-2-2;
(2)多重继承下的Virtual table
图片4-2-3;

图片4-2-4;

注:Sun编译器将多个Virtual tables 连锁为一个:指向次要表格的指针,可由主要表格名称加上一个offset获得(可以获得速度提升)。
(3)虚拟继承下的Virtual Functions

图片4-2-5;

图片4-2-6;
注:不要在一个Virtual base clas 中声明Nonstatic data members,否则,虚基类,虚函数和相关继承导致的各种offset调整所来的复杂性会让你犹如进入迷宫一般。
============================================================================
4-4. 指向 Member Function 的指针
(1)普通Member Function 指针

图片4-4-1;
//member function指针的声明语法:
double (Point::*coord)();
//指定其值
coord = &Point::y;
//调用.origin为Point对象
(origin.*coord)(); // 或 (ptr->*coord)();
// 此操作会被编译器转化为如下形式:
// 虚拟C++码
(coord)(&origin) // (coord)(ptr);
(2)支持“指向Virtual Member Functions”之指针

图片4-4-2;

图片4-4-3;
(3)在多重继承之下

图片4-4-4;
============================================================================
4-5. Inline Functions

图片4-5-1;
(1)形式参数

图片4-5-2;
(2)局部变量

图片4-5-3;

图片4-5-4;

图片4-5-5;

图片4-5-6;

图片4-5-7;
============================================================================
Inside The C++ Object Model(四)的更多相关文章
- C++学习书籍推荐《Inside the C++ Object Model》下载
百度云及其他网盘下载地址:点我 作者简介 Stanley B. Lippman is Architect with the Visual C++ development team at Microso ...
- inside the C++ Object model总结
一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...
- Inside The C++ Object Model(二)
============================================================================2-0. 关键字explicit被引入C++,提 ...
- Inside The C++ Object Model - 03
object Lessons 1.C++中布局以及存取时间上的的额外负担是由virtual引起的:virtual function.virtual base class.或是由于多继承引起的. 2.C ...
- Inside The C++ Object Model(五)
============================================================================5-0. 一般而言,class 的data me ...
- Inside The C++ Object Model(三)
============================================================================3-0. 类所占的内存大小受到三个因素的影响:( ...
- Inside The C++ Object Model(一)
============================================================================1-1. 关键字struct和class的一点区 ...
- Inside The C++ Object Model - 04 C++对象模型的一个简单示例
首先定义一个类X class X { public: X(); X(const X& x); virtual ~X(); virtual foo(); } 再来一段代码: X foobar() ...
随机推荐
- 1. cs231n k近邻和线性分类器 Image Classification
第一节课大部分都是废话.第二节课的前面也都是废话. First classifier: Nearest Neighbor Classifier 在一定时间,我记住了输入的所有的图片.在再次输入一个图片 ...
- db2 load报文件系统满
使用db2 load导入数据 数据量比较大时常常会报文件系统已满错误. 原因分析:导入表建有索引,在load的“索引复制”阶段会从系统临时表空间拷贝到目标表空间,导致系统临时表空间所在的文件系统满,l ...
- elastic-job详解(四):失效转移
elastic-job中最关键的特性之一就是失效转移.配置了失效转移之后,如果在任务执行过程中有一个执行实例挂了,那么之前被分配到这个实例的任务(或者分片)会在下次任务执行之前被重新分配到其他正常节点 ...
- Ajax发送请求,并接受字符串
前台: $.ajax({ type: 'POST', url: url, dataType: "json", success : function(data){ alert(&qu ...
- Android 模拟器启动不了-问题解决方案
一.Android 模拟器启动不了问题解决方案 在安装Android开发环境时,首先安装java虚拟机,然后下载android adk 管理android虚拟机. 在完成工作后,添加android的虚 ...
- 处理程序“AllowAccessJavaScripts”在其模块列表中有一个错误模块“ManagedPipelineHandler”
处理程序“AllowAccessJavaScripts”在其模块列表中有一个错误模块“ManagedPipelineHandler” 执行命令"cd C:\Windows\Microsoft ...
- MUI框架开发HTML5手机APP(二)--页面跳转传值&底部选项卡切换
概 述 JRedu 在上一篇博客中,我们学习了如何使用Hbuilder创建一个APP,同时如何使用MUI搭建属于自己的第一款APP,没有学习的同学可以戳链接学习: http://www.cnblo ...
- IndexDB 操作util
https://dexie.org/ https://www.tangshuang.net/5668.html https://github.com/tangshuang/hello-indexedd ...
- android自己定义控件之飞入飞出控件
近期呢,本人辞职了.在找工作期间.不幸碰到了这个求职淡季,另外还是大学生毕业求职的高峰期,简历发了无数份却都石沉大海.宝宝心里那是一个苦啊! 翻着过去的代码,本人偶然找到了一个有意思的控件.那时本人还 ...
- 一步步教你轻松学关联规则Apriori算法
一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...