zoukankan      html  css  js  c++  java
  • C++ Member Functions的各种调用方式

    【1】Nonstatic Member Functions(非静态成员函数)

    C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。也就是说,如果我们要在以下两个函数之间作选择:

    float magnitude3d(const Point3d* _this) {...};
    float Point3d::magnitude3d() const {...};

    那么选择member function不应该带来什么额外负担。这是因为编译内部已将“member 函数实体”转换为对等的“nonmember函数实体”。

    下面就是转化步骤:

    1、改写函数的signature以安插一个额外的参数到member function中,用以提供一个存取管道,是class object得以调用该函数。该额外参数被称为this指针;

    2、将每一个“对nonstatic data member的存取操作”改为经由this指针来存取;

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

    现在这个函数已经被转换好了,而其每一个调用操作也都必须转换。于是:

    obj.magnitude();

    变成了:

    magnitude_7Point3dFv(&obj);

    ptr->magnitude();

    变成了:

    magnitude_7Point3dFv(ptr);

    【2】Static Member Functions(静态成员函数)

    如果Point3d::normalize()是一个static member function,以下两个调用操作:

    obj.normalize();

    ptr->normalize();

    将被转换为一般的nonmember函数调用,像这样:

    normalize_7Point3dSFv();        //obj.normalize();
    normalize_7Point3dSFv();        //ptr->normalize();

    【3】Virtual Member Functions(虚拟成员函数)

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

    ptr->normalize();

    将会被内部转化为:

    (*ptr->vptr[1])(ptr);

    其中:

    (1)vptr表示由编译器产生的指针,指向virtual table。它被安插在每一个“声明有(或继承自)一个或多个virtual functions”的class object中。事实上其名称也会被“mangled”,因为在一个复杂的class派生体系中,可能存在有多个vptrs。

    (2)1是virtual table slot的索引值,关联到normalize()函数。

    (3)第二个ptr表示this指针。

  • 相关阅读:
    自定义Maven Archetype模板
    [Discuz!NT] Crash问题记录
    echarts渐变色实现方法
    关于windows7 IIS 7.5和Vista IIS 7.0 局域网无法访问的解决方法
    返回接口信息
    [转]简易下拉框式日期选择器(带闰平年判断)
    漂亮的验证码
    EXT.NET 使用 Ueditor编辑器,并在后台获取的方法
    WIN7 IIS不能显示特殊图片 “+”,""号的图片需要转义才可以显示
    人才网查找职位的复杂SQL用法
  • 原文地址:https://www.cnblogs.com/dongerlei/p/5405252.html
Copyright © 2011-2022 走看看