C++ Object Model
Data member 对象属性
Function member 类属性
Static member类属性
Implicit member :virtual pointer and virtual table etc.
Virtual mechanism: virtual function and virtual base class
Default Constructor的建构操作(观念 和 实际)
有四种情况,会导致编译器必须为未声明Constructor之Classes合成一个Default Constructor。
C++ Standard把那些合成物称为Implicit nontrivial Default Constructor, 只能满足编译器的需要。它们之所以能够完成任务,是凭借Member object 和Base class的Default Constructor, 或者Virtual function ,Virtual base class 机制。至于不是以上情况的而又没有声明任何的Constructor的Classes,我们说它拥有的是Implicit trivial Default Constructor,它们实际上不被合成出来。
Virtual Base Class的实现在不同的编译器有极大的差异,然而每个编译器对虚拟机制的支持保证,每种实现法的共同点在于必须使Virtual Base Class在其每一个Derived class object中的位置,能够于执行期准备妥当。
C++新生误解:
1.没有声明任何的Constructor的Classes会合成出一个Default Constructor。
2.合成出的Default Constructor会明确设定Class 内每个data member。
Copy Constructor Semantics
Default member wise initialization: Bitwise Copy Semantics
不要Bitwise Copy的四种情况和合成Implicit nontrivial Default Constructor时一样。
就像Default Constructor的建构操作一样,C++ Standard也把Copy Constructor区分为trivial和non-trivial俩种。只有non-trivial被合成,而决定Copy Constructor属于那种在于Class是否展现出所谓的Bitwise Copy Semantics。
针对虚函数,合成出来的Copy Constructor会明确设定Object的vptr指向对应的virtual table。
程序转换语义
1. 明确的初始化
2. 参数和还回值的初始化
3. 使用者优化 和 编译器优化
4.Member Initialization List
Copy Constructor的使用,迫使编译器多多少少对你的程序代码做部分优化。
1. Reference Member & Const Member
2. Call Base Class的Constructor & member Class 的Constructor
编译器会一一操作Member Initialization List,以适当次序在Constructor内部安插初始化操作,并在任何Explicit user code之前。
Presence of a pure virtual function:必须在派生类中覆盖,否则导致编译错误
1. 可以定义和静态调用
2. pure virtual destructor必须定义, 否则不要声明
对对象设定初值,给予一个Explicit initialization list 会比 constructor来得高效。
缺点:1。必须Public 2。只能指定常量 3。非编译器自动施行,可能失败
Copy Assignment Operator Semantics:The same as Copy Constructor,但缺乏initialization list
在虚基类下没有实现压抑上层Base class的copy assignment operator,编译器没有重复类似Constructor的解决方案, 因为取Copy Assignment Operator的地址合法。没有避免多重拷贝,一个实体空间。
Semantics of destruction:The same as Constructor, 但顺序相反:
1) Destructor函数体
2) 拥有Destructor的Member class objects以声明时相反的顺序被调用
3) 如果有virtual pointer, 则现在被重新设定,指向适当之Base class的virtual table。
4) 拥有Destructor的Non-virtual base classes以声明时相反的顺序被调用
5) 拥有Destructor的virtual base classes以构造相反的顺序被调用
此处应该拒绝对称方式的想法,应该因为需要而非感觉来提供Destructor
虚基类->基类->虚表指针->子对象->函数体
Semantics of Data:绑定,布局,存取
Class object 必须容纳所有的non-static members, 可能比想象的大,原因是:
1 编译器自动的扩展,用以支持某些语言特性
2 Alignment的需要
单结构->只有继承->加多态->多重继承->虚拟继承
1. Data Member 的绑定:对Member functions Body的分析,会直到整个class的声明出现后才开始,但对Argument List 并不如此。
2. Data Member 的布局(non-static):C++ Standard要求在同一个access section中,members 的排列只需要符合较晚出现的member在较高的地址,什么会介于其间?Alignment and virtual pointer etc.。
3. Data Member 的存取:Members的位置在编译时固定,存取时只是一个简单的Offset运算。
Static member:于Class之外,独立实体,内部转换为对该唯一的extern实体的直接操作。
Non-static member:对象地址加偏移形成。在虚拟继承下效率会影响,其它情况和struct。
对象成员的效率由快变慢:结构->单一继承->虚拟继承->多重虚继承, 间接性变多
指向Data member的指针效率比直接使用慢一倍不止,继承的引入也如此,只是虚拟继承妨碍了优化的有效性。
Multiple inheritance
C++保证出现在Derived Class中的Base class sub object有其完整性。
Semantics of function
Name Mangling:不同编译器不同,编译错误消息用的程序代码函数名称,然而连接器用的是经过mangled 的名称。
Member functions:static , non-static, vitual
C++ Standard要求non-static至少要和一般的non-member function有相同的效率。实际上被内化为non-member function:1、安插this参数 2、存取改由this访问 3、Name Mangling 4、调用处转换
只有class拥有virtual function, 就需要额外的执行期信息
1) 在单一继承体系中,virtual机制良好,有效率且容易模型,仅一个virtual tables。
2) 在多重继承中,一个derived class内含一个主要virtual tables和n-1个额外的, n 表示base class的数目。
3) 在虚拟继承中,对虚基类还有一个虚表。
4) 函数的效率:继承深度和继承方式
All functions被编译器改变:
1) non-static, vitual安插this于argument and body,而static没有
2) non-static和static一般调用方式,而vitual通过索引号得到函数地址间接调用
3) 一个static member function,被提出之外,并Mangled。取地址得到的是内存中的地址,由于没有this指针,其地址类型不是指向class member function ,而是一个non-member function指针。指向(non-static data)的指针不同于一般指针,它只提供所属类的对象的相对偏移。指向(virtual function)的指针不同于一般指针,它只提供虚表中的相对偏移。指向(non-virtual function)的指针同于一般指针,它提供函数内存中的地址。
Inline 强有力,但需要更加小心处理。Formal Argument and Local Variable。
执行期语义
对象的构造与解构
1) 全局对象
2) 静态局部对象
3) 对象数组
4) Default constructor and 数组
New 和 Delete 运算符
1) 针对数组的new语意
2) Placement operator new
临时性对象
站在对象模型的尖端
Template 的声明
Template Instantiation
指针和引用,对象化
functions使用时才具现:效率,尝未实现的机能
Error Reporting with a Template::与类型有关的检查,必须延迟到具现, 对Template的处
理是完全解析,而不做类型检查。
Name Resolution with a Template:
1、Scope of the template declaration
2、Scope of the template instantiation
对一个non-member name,是根据name的使用是否与具现出来的Template 参数相关决定的,互不相关则1,若互有关联则2。
模板设计中的非习惯性思维
• 申明并不一定要定义:禁止某些调用或者泛化
• 定义类不一定要有成员、成员不仅仅是方法和成员变量
Exception Handling
RTTI
Abstract Class
• 具有纯虚函数的类就是抽象类
• 抽象类不能被实例化,所以抽象类只能以指针方式被应用
• 抽象类可以防止切片的发生
• 抽象类不产生虚表。