============================================================================
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(四)的更多相关文章

  1. C++学习书籍推荐《Inside the C++ Object Model》下载

    百度云及其他网盘下载地址:点我 作者简介 Stanley B. Lippman is Architect with the Visual C++ development team at Microso ...

  2. inside the C++ Object model总结

    一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...

  3. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  4. Inside The C++ Object Model(二)

    ============================================================================2-0. 关键字explicit被引入C++,提 ...

  5. Inside The C++ Object Model - 03

    object Lessons 1.C++中布局以及存取时间上的的额外负担是由virtual引起的:virtual function.virtual base class.或是由于多继承引起的. 2.C ...

  6. Inside The C++ Object Model(五)

    ============================================================================5-0. 一般而言,class 的data me ...

  7. Inside The C++ Object Model(三)

    ============================================================================3-0. 类所占的内存大小受到三个因素的影响:( ...

  8. Inside The C++ Object Model(一)

    ============================================================================1-1. 关键字struct和class的一点区 ...

  9. Inside The C++ Object Model - 04 C++对象模型的一个简单示例

    首先定义一个类X class X { public: X(); X(const X& x); virtual ~X(); virtual foo(); } 再来一段代码: X foobar() ...

随机推荐

  1. 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数 (转)

    http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORAC ...

  2. pygame 笔记-3 角色动画及背景的使用

    上二节,已经知道如何控制基本的运动了,但是只有一个很单调的方块,不太美观,本节学习如何加载背景图,以及角色的动画. 素材准备:(原自github) 角色动画的原理:动画都是一帧帧渲染的,比如向左走的动 ...

  3. [Java代码] Java用pinyin4j根据汉语获取各种格式和需求的拼音

    pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j.下面介绍用pinyin4j来做的一个根据汉语获取各种格式和需求的拼音d ...

  4. Cocos Creator下删除AnySDK步骤

    1.删除 frameworks/runtime-src/Classes 下的 jsb_anysdk_basic_conversions.cpp manualanysdkbindings.cpp jsb ...

  5. Git结合tar自动打升级包

    背景最近在看Git,那么看了之后就需要用Git来解决一些工作中遇到的问题,学了不能用在工作中,等于白学. 这次遇到的问题是打包升级的问题,我们公司目前还处于最原始的手工打更新包的状况,每次打包都要找开 ...

  6. Spark2.3(四十):如何使用java通过yarn api调度spark app,并根据appId监控任务,关闭任务,获取任务日志

    背景: 调研过OOZIE和AZKABA,这种都是只是使用spark-submit.sh来提交任务,任务提交上去之后获取不到ApplicationId,更无法跟踪spark application的任务 ...

  7. Java RandomAccessFile与MappedByteBuffer

    Java RandomAccessFile与MappedByteBuffer https://www.cnblogs.com/guazi/p/6838915.html

  8. [Vuex] Perform Async Updates using Vuex Actions with TypeScript

    Mutations perform synchronous modifications to the state, but when it comes to make an asynchronous ...

  9. iis url重写

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...

  10. 安装了 R2 Integration Servic 之后,SQL Server 2008 Management Studio报错

    问题产生 IM数据库服务器未安装Integration Servic,影响备份.在安装了安装了 SQL Server 2008 R2 Integration Servic 之后,SQL Server ...