Function 语意学

Member 的调用方式

1.Nonstatic Member Functions (非静态成员函数)

member function被内化为nonmember的形式,转化步骤如下:

(1)改写函数的signature以安插一个额外的参数到member function中,用以提供一个存取管道,使class得以调用该函数。该额外参数被称为this指针;

(2)将每个“对nonstatic data member的存取操作”改为经由this指针存取;

(3)将member function重新写成一个外部函数,对函数名称进行mangling处理,使它在程序中成为独一无二的词汇。

名称的特殊处理:加上class名称,参数,参数类型。

 

2. Static Member Functions (静态成员函数)

Point3d::normalize() 是一个static member function,以下调用操作:

obj.normalize();

ptr->normalize();

将被转换为一般的nonmember函数调用。

Static member functions的主要特性是没有this指针:

(1)它不能够直接存取class中的nonstatic members;

(2)它不能够被声明为const、volatile、或virtual;

(3)它不需要经由class object才被调用。

 

C++中,多态表示以一个public base class的指针或引用,寻址出一个derived class object的意思

一个class只会有一个virtual table。每一个table内含其对应的class object中所有active virtual functions函数实体的地址。这些active virtual functions包括:

(1)这个class所定义的函数实体,它会改写一个可能存在的base class virtual function函数实体;

(2)继承自base class的函数实体。这是在derived class决定不改写virtual function时才会出现的情况。

(3)一个pure_virtual_called()函数实体,既可以扮演pure virtual function的空间保卫者角色,也可以当做执行期异常处理函数。

 

支持指向virtual member functions的指针

float (Point::*pmf) () = &Point::z;

Point* ptr = new Point3d;

pmf一个指向member function的指针,被设值为Point::z()(一个virtual function)地址。

ptr->z();  调用的是Point3d::z()。

(ptr->*pmf)();   调用的也是Point3d::z() ,即虚拟机制仍然能够在使用“指向member function之指针”的情况下运行。

 

对一个nonstatic member function取地址,将获得该函数在内存中的地址,而对一个virtual function取地址,所能够获得的只是一个索引值。

posted @ 2020-09-23 17:38  c++11  阅读(144)  评论(0编辑  收藏  举报