C++函数语意学

来源:互联网 发布:上海玄云网络的炮妹 编辑:程序博客网 时间:2024/05/16 23:48

 C++支持三种类型的member function: static 、nonstatic 和 virtual

 

static member function 不能直接存取nonstatic 数据,而且不能被声明为const;

 

 

1、Nonstatic member function(非静态成员函数)

     效率:

           nonstatic member function至少必须和一般的nonmember function有相同的效率。选择member function不应该带来什么额外负担,因为编译器内部将"member函数实体"转换为对等的"nonmember 函数实体"。

     转化步骤:

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

          2)将每一个"对 nonstatic data member 的存取操作"改为经由this指针来存取

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

 

           注:如果copy constructor已经声明好了,其间编译器可能会实施named returned value(NVR)的优化。

 

2、Virtual Member Function(虚拟成员函数)

     如果 normalize() 是一个 virtual member function, 那么一下的调用:

            ptr->normalize();

     将被内部转化为:

            (* ptr->vptr[1])(ptr); (注:1是 virtual table slot 的索引值,第二个ptr表示this指针)

     vptr(虚函数指针)是由编译器产生的指针,指向 virtual table 。vptr被安插在每一个"声明有(或者继承自) 一个或多个 virtual functions" 的 class object 中。

     如果virtual 成员函数 Point3d::magnitude()在虚函数Point3d::normalize中调用,而后者已经由虚拟机制而决议(resolved)妥当,所以明确的调用"Point3d"会比较有效率,并因此压制由于虚拟机制而产生的不必要的重复调用操作。编译器正是这样做的。

      经由一个class object调用一个virtual function , 这种操作应该总是被编译器像对待一般的nonstatic member function 一样地加以决议(resolved)。这项优化工程的另一个利益是,virtual function 的一个 inline 函数实体可以被扩展( expanded )开来,因此提供极大的效率利益。

 

 

3、Static Member Function(静态成员函数)

     static member functions的主要特征就是它没有this指针。

     其次要特征统统根源于其主要特征:

    1) 不能够直接存取其 class 中的 nonstatic members.

    2) 不能够被声明为const、volatile 或 virtual.

    3) 不需要经由class object 才被调用----虽然大部分时候它是这样被调用的

 

    由于 static member function 没有 this 指针, 所以其地址的类型并不是一个 "指向 class member function 的指针", 而是一个 " nonmember 函数指针"。也就是说:

                       &Point3d::object_count();

    会得到一个数值,类型是:

                       unsigend int (*)();

   而不是:

                       unsigned int (Point3d::*)();

 

   由于 static memeber function 没有 this 指针,因此差不多等同于nonmember function, 它提供了一个意想不到的好处:成为一个callback函数,使我们得以将C++和C-based X Window 系统相结合。它们也可以成功地应用在线程(threads)函数上。