第三章 函数成员
1.1. 成员函数的三种调用方式
1.1.1. 非静态成员函数
非静态成员函数的效率和非成员函数相同,也就是说
float magnitude(const Point3d * _this) {…};
和
float Point3d::magnitude() const {…};
的效率相同。
成员函数的转化步骤如下(编译器所做的工作):
l 改写函数原型
//非静态成员函数
Point3d::magnitude(Point3d * const this);
//常量非静态成员函数
Point3d::magnitude(const Point3d * const this);
l 对非静态数据成员的存取改由this指针完成
{this->xxxxx}
l 把成员函数改写为一个外部函数,对函数名称进行处理,使它在程序中独一无二
1.1.2. 虚成员函数
l 通过指针调用
Point3d *ptr;
……
ptr->normalize();
在内部将被转化成为(*ptr->vptr[1])(ptr);
l 通过对象调用
Point3d obj;
Obj.normalize();
由于编译器可以确定调用的肯定是Point3d::normalize(),因此在内部这样的调用将被转化为:
normalize_7Point3dEv(&Obj);//经过编码的函数名称,在整个程序中保持唯一性。
1.1.3. 静态成员函数
Point3d *ptr;
……
Point3d obj;
ptr->normalize();
Obj.normalize();
在内部都将被转化为normalize_7Point3dEv();
静态成员函数的主要特征是没有this指针,其次要特征为
1. 不能够直接存取Class中的非静态成员
2. 不能被声明为const、volatile或vitrual
不用经过Class Object才能够调用