学会从C++ Object Model着手分析(二)
来源:互联网 发布:淘天下网络pos机 编辑:程序博客网 时间:2024/05/22 04:52
[item 1]
一个空的class如:
Class X{};
//sizeof X == 1
事实上并不是空的,他有一个隐晦的1byte,那是被编译器安插进取的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址。
[item 2]
Static member functions的主要特性就是它没有this指针。以下的次要特性统统根源于其主要特性:
· 它不能够直接存取其class中的nonstatic members;
· 它不能够被声明为const、volatile、或virtual;
· 它不需要经由class object才能调用。
[item 3]
一个class只会有一个virtual table。每一个table内含有其对应的class object中所有active virtual functions函数实体的地址。
· 它可以继承base class所声明的virtual functions的函数实体。(该函数实体的地址会被拷贝到derived class的virtual table相对应的slot之中);
· 它可以使用自己的函数实体。这表示它自己的函数实体地址必须放在对应的slot之中;
· 它可以加入一个新的virtual function。这时候virtual table的尺寸会增大一个slot,而新的函数实体地址会被放进该slot之中。
由此可见每个class类型的virtual table都是可以预知的,并且同一虚函数在继承体系中的所有相关类的virtual table offset是固定的。执行期的多态只是决定条用哪一个函数实体而已。
多继承情况稍微复杂一些。在多重继承下,一个derived class内含n-1个额外的virtual tables,n表示其上一层base classes的数目)同一函数在virtual table中可能需要多笔对应的slots.
[item 3]
指向虚表的指针vptr,经由编译器所产生的代码,将在constructor(s)中被设立初值。
[Item 4]
当我们设计一个class,并以一个class object指定给另一个class object时,有三种选择:
1.什么都不做,因此得以实施默认行为;
2.提供一个explicit copy assignment operator;
3.明确地拒绝把一个class object制定给另外一个class object.将copy assignment operator声明为private,并且只声明不定义。
[Item 5]
建议尽可能不要允许一个virtual base class的拷贝操作。甚至提供一个比较奇怪的建议:不要在任何virtual base class中声明数据。
虚基类在Derived class object中只有一份,拷贝操作容易给编译器带来额外负担。
[Item 6]
解析语义学:如果class没有定义destructor,那么只有在class内带的member object(或是class自己的base class)拥有destructor的情况下,编译器才会自动合成出一个。与是否拥有virtual function无关。
对于决定class是否需要一个程序层面的destructor,程序员需要考虑的是一个class object的生命在哪里结束?需要什么样的操作才能保证对象的完整?
- 学会从C++ Object Model着手分析(二)
- 学会从C++ Object Model着手分析(一)
- Page Object Model (Selenium + Python)(二)
- 走进单元测试二:测试需要从哪些方面着手
- DHTML对象模型(About the DHTML Object Model)(二)
- object-c 学习(二)
- openstack4j 源码分析(二) model对象
- 一周学会C#(前言续二)
- 一周学会C#(函数二)
- 一周学会C#(语句二)
- 一周学会C#(枚举二)
- 一周学会C#(结构二)
- 一周学会C#(属性二)
- 一周学会C#(索引二)
- 一周学会C#(类二)
- 一周学会C#(属性二)
- 一周学会C#(类二)
- object-c之从"Hello World"开始(object-c)
- 在Android模拟器上安装和卸载APK包
- 再论精确延时(usleep,nanosleep,select)
- JavaScript实现二代身份证号码转一代身份证号码
- sql 界面 中英文互换
- MeeGo是什么?
- 学会从C++ Object Model着手分析(二)
- python 字典
- MS sql server中时间函数用法详解 DATEADD DATEDIFF
- Linux 创建多进程 & 线程时的进程栈段处理
- How to solve error PRJ0050
- oracle 连接符
- 进程管理和作业控制
- Java byte[]和char[]互转
- 你是我的幸福吗