Nonstatic Member Functions(非静态成员函数)
考虑如下代码:
float magnitude3d(const Point3d *_this) {};
float Point3d::magnitude3d() const {};
选择 member function
不应该带来什么额外负担,因为编译器内部已经将“member函数实例”转换为对等的“nonmember函数实例”
名称的特殊处理
一般而言,member
的名称前面会被加上class
名称,形成独一无二的命名:
class Bar {public : int ival;}
其中ival
有可能变成这样:ival_3Bar
;为什么编译器要这么做?请考虑如下派生操作:
class Foo : public Bar {public : int ival;};
Foo
对象内部结合了base class
和derived class
两者:
class Foo {
public:
int ival_3Bar;
int ivla_3Foo;
}
不管你要处理哪个ival
,通过"name manglin",都可以绝对清楚指出来。
virtual Member Functions(虚拟成员函数)
如果normalize()
是一个virutal member function
,那么以下的调用:
ptr->normalize();
将会被内部转化为:
(*ptr->vptr[1])(ptr);
- vptr表示由编译器产生的指针,指向
virtual table
- 1是
virtual table slot
的索引数值,关联到nomalize
函数 - 第二个
ptr
表示this
指针