C++ Object Model

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的建构操作(观念 实际)

有四种情况,会导致编译器必须为未声明ConstructorClasses合成一个Default Constructor

C++ Standard把那些合成物称为Implicit nontrivial Default Constructor, 只能满足编译器的需要。它们之所以能够完成任务,是凭借Member object Base classDefault Constructor, 或者Virtual function Virtual base class 机制。至于不是以上情况的而又没有声明任何的ConstructorClasses,我们说它拥有的是Implicit trivial Default Constructor,它们实际上不被合成出来。

Virtual Base Class的实现在不同的编译器有极大的差异,然而每个编译器对虚拟机制的支持保证,每种实现法的共同点在于必须使Virtual Base Class在其每一个Derived class object中的位置,能够于执行期准备妥当。

C++新生误解:

1.没有声明任何的ConstructorClasses会合成出一个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区分为trivialnon-trivial俩种。只有non-trivial被合成,而决定Copy Constructor属于那种在于Class是否展现出所谓的Bitwise Copy Semantics

针对虚函数,合成出来的Copy Constructor会明确设定Objectvptr指向对应的virtual table

 

程序转换语义

1.  明确的初始化

2.  参数和还回值的初始化

3.  使用者优化 编译器优化

4Member Initialization List

Copy Constructor的使用,迫使编译器多多少少对你的程序代码做部分优化。

1.  Reference Member & Const Member

2.  Call Base ClassConstructor & 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 SemanticsThe same as Copy Constructor,但缺乏initialization list

在虚基类下没有实现压抑上层Base classcopy assignment operator,编译器没有重复类似Constructor的解决方案, 因为取Copy Assignment Operator的地址合法。没有避免多重拷贝,一个实体空间。

 

Semantics of destructionThe same as Constructor, 但顺序相反:

1)        Destructor函数体

2)        拥有DestructorMember class objects以声明时相反的顺序被调用

3)        如果有virtual pointer, 则现在被重新设定,指向适当之Base classvirtual table

4)        拥有DestructorNon-virtual base classes以声明时相反的顺序被调用

5)        拥有Destructorvirtual 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 functionsstatic , non-static, vitual

C++ Standard要求non-static至少要和一般的non-member function有相同的效率。实际上被内化为non-member function1、安插this参数 2、存取改由this访问 3Name Mangling  4、调用处转换

 

只有class拥有virtual function, 就需要额外的执行期信息

1)        在单一继承体系中,virtual机制良好,有效率且容易模型,仅一个virtual tables

2)        在多重继承中,一个derived class内含一个主要virtual tablesn-1个额外的, n 表示base class的数目。

3)        在虚拟继承中,对虚基类还有一个虚表。

4)        函数的效率:继承深度和继承方式

 

All functions被编译器改变:

1)        non-static, vitual安插thisargument and body,而static没有

2)        non-staticstatic一般调用方式,而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

       1Scope of the template declaration

       2Scope of the template instantiation

       对一个non-member name,是根据name的使用是否与具现出来的Template 参数相关决定的,互不相关则1,若互有关联则2

 

模板设计中的非习惯性思维

         申明并不一定要定义:禁止某些调用或者泛化

         定义类不一定要有成员、成员不仅仅是方法和成员变量

 

 

Exception Handling

RTTI

 

Abstract Class

         具有纯虚函数的类就是抽象类

         抽象类不能被实例化,所以抽象类只能以指针方式被应用

         抽象类可以防止切片的发生

         抽象类不产生虚表。

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值