标签:
1. Nonstatic member function(非静态成员函数)的调用方式
编译器会将”member 函数实例“转换为对等的”nonmember函数实例“。
对于非静态成员函数
float Point3d::magnitude3d() const{...}
转换步骤如下:
1. 改写函数的signature(意指:函数原型)以安插一个额外的参数到member function中,用以提供一个存取管道,使class object得以将此函数调用。该额外参数被称为this指针:
//non-const nonstatic member的扩张过程 Point3d Point3d::magnitude(Point3d *const this) 如果是member function 是const,则变成: //const nonstatic member的扩张过程: Point3d Point3d::magnitued(const Point3d *const this)
2. 将每一个”对nonstatic data member的存取操作”改为经由this指针来存取:
3.将member function重新写成一个外部函数。将函数名称经过“mangling”处理,使它在程序中成为独一无二的词汇:
extern magnitude_7Point3dFv( register Point3d *const this);
现在这个函数已经被转换好了,而其每一个调用操作也都必须被转换。于是:
1 obj.magnitude(); 2 变成了: 3 magnitude_7Point3dFv(&obj); 4 而 5 ptr->magnitued(); 6 变成了: 7 magnitude_7Point3dFv(ptr);
2. Virtual Member Functions(虚拟成员函数)
使用指针调用虚拟函数:
如果normalize()是一个virtual member function,那么以下的调用:
ptr->normalize();
将会被内部转化为:
(*ptr->vptr[1])(ptr);
其中:
使用类对象调用虚拟函数:
使用类对象调用虚拟函数,其解析方式和非静态成员函数一样。对于上一节中的normalize()函数。调用方式最终被解析为:
normalize_7Point3dFv(&obj);
3. Static member Function(静态成员函数)
1.静态成员函数的主要特性:
2. 取一个静态成员函数的地址,获得的将是其在内存中的位置,也就是其地址。由于static member function没有this指针,所以其地址类型并不是一个“指向class member function的指针”,而是一个“nonmember函数指针“
【C++】深度探索C++对象模型读书笔记--Function(The Semantics of Function)
标签:
原文地址:http://www.cnblogs.com/vincently/p/4652795.html