【c++】Function语义学之成员函数调用方式

非静态成员函数

编译器内部已将member函数实体转换为对等的nonmember函数实体。

转化步骤:

1.改写函数原型以安插一个额外的参数到member function中,使class object可以调用该函数,该额外参数为this指针。

2.将函数中每一个对nonstatic data member的存取操作改为经由this指针来存取

3.对函数名称进行处理,使它在程序中成为独一无二的词汇。

名称的特殊处理

一般而言,member的名称前面会由编译器加上class名称,形成独一无二的命名。

class bar

{

public:

  int ival;

};

编译后ival可能会变成ival_bar.之所以如此处理,是为了防止以下的操作:

class foo:public bar

{

public:

  int ival;

};

这样编译后会变成这样:

class foo

{

public:

  int ival_bar;

  int ival_foo;

};

由于member function可以被重载化,所以需要更广泛的mangling手法,以提供独一无二的名称。编译器利用函数名称、参数个数、参数类型来使得函数有着独一无二的名称。这样一来,可以捕捉链接时期函数名称+参数数目+参数类型方面的错误,但是如果返回类型出错,就没办法检查出来。

virtual member function(虚函数)

point3d obj;
point3d *ptr = &obj;

若normalize()是虚函数,则ptr->normalize()将会被内部转化为(*ptr->vptr[1])(ptr)

其中,vptr表示由编译器产生的指针,指向virtual table,它被安插在每一个声明有(或继承自)一个或多个virtual function的class object中。

1是virtual table slot的索引值,关联到normalize()函数,第二个ptr表示this指针。

注意:经由一个class object调用virtual function,这种操作总是被编译器像对待一般的nonstatic member function一样加以决议,也就是不会用到虚指针。

静态成员函数

static member function的主要特性是没有this指针,以下次要特性统统根源于主要特性:

1.它不能够直接存取其class中的nonstatic members(需要this指针)

2.它不能够被声明为constant volatile或virtual

3.可以通过类名或class object来调用

【c++】Function语义学之成员函数调用方式,布布扣,bubuko.com

【c++】Function语义学之成员函数调用方式

上一篇:浅析java类加载器ClassLoader


下一篇:python和python-dev