member的各种调用方式
- C++支持三种类型的member functions:static、nonstatic和virtual。
- nonstatic member functions会被编译器转换为对等的nonmember function。安插一个额外的参数this指针以改写函数的signature,对nonstatic data member的存取操作改为由this指针来存取,函数名称经过mangling处理(考虑class名称和参数)成后成为一个外部函数。
- virtual member function经由指针(或引用)调用时将被转换为类似
(*ptr->vptr[1])(ptr)
这种形式,经由一个class object调用时将被像对待一般nonstatic member function一样地加以决议。 - static member function会被提出于class声明之外,并给予一个经过mangled的适当的名称,以对象、引用或指针调用static member function将被转换为一般的nonmember函数调用。
虚拟成员函数
- 为了支持virtual function机制,必须首先能够对于多态对象有某种形式的“执行期类型判断法”,需要一份执行期相关信息。
- 何时才需要这份信息?多态(polymorphism)表示“以一个public base class的指针(或reference),寻址出一个derived calss object”的意思。消极多态可以在编译期完成,积极多态需要额外的执行期信息。
- 什么样的额外信息我们需要存储起来?我们需要知道:1)指针或引用所指对象的真实类型,2)以及被调用实例的位置。
- 如何实现?1)一个字符串或数字表示所指对象的真实类型,2)一个指针,指向某表格,表格中持有程序的virtual functions的执行期地址,即被调用实例的位置,3)每一个virtual function被指派一个表格索引值。这些都是在编译期完成的。
- 如何有足够的知识在编译时期设定virtual function的调用呢?1)虽然通过指针(或引用)调用某虚函数时,我们并不知道该指针(或引用)所指对象的真正类型,但是我们知道,经由该指针(或引用)可以存取到该对象的virtual table,2)虽然我们不知道继承体系中具体哪一个虚函数实例会被调用,但是我们知道被调用的虚函数的地址确实都被放在对应的一个表格中。
- 在多重继承中支持virtual functions,经由第二个或后继的base class指针(或reference)调用derived class virturl function,其所连带的必要的this指针调整操作,必须在执行期完成。
指向member function的指针
- 取一个nonstatic member function的地址得到的将是它在内存中的地址,类型是一个指向member funtction的指针。
- 取一个static member function的地址得到的将是它在内存的地址,类型是一个指向nonmember function的指针。
- 取一个virtual member function的地址得到的将是它在与其相关之virtual table中的索引值。
inline functions
- 形式参数有三种情况,常量表达式在替换之前完成求值,非常量表达式无副作用直接替换之,有副作用的参数需要导入一个临时性变量避免重复求值。
- 局部变量都必须被放在函数调用的一个封闭区段中,拥有一个独一无二的名称。
- inline函数中的局部变量,再加上有副作用的参数,可能会导致大量的临时性对象产生。