• Function 语意学


    Member 的调用方式

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

    member function被内化为nonmember的形式,转化步骤如下:

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

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

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

    名称的特殊处理:加上class名称,参数,参数类型。

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

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

    obj.normalize();

    ptr->normalize();

    将被转换为一般的nonmember函数调用。

    Static member functions的主要特性是没有this指针:

    (1)它不能够直接存取class中的nonstatic members;

    (2)它不能够被声明为const、volatile、或virtual;

    (3)它不需要经由class object才被调用。

    C++中,多态表示以一个public base class的指针或引用,寻址出一个derived class object的意思

    一个class只会有一个virtual table。每一个table内含其对应的class object中所有active virtual functions函数实体的地址。这些active virtual functions包括:

    (1)这个class所定义的函数实体,它会改写一个可能存在的base class virtual function函数实体;

    (2)继承自base class的函数实体。这是在derived class决定不改写virtual function时才会出现的情况。

    (3)一个pure_virtual_called()函数实体,既可以扮演pure virtual function的空间保卫者角色,也可以当做执行期异常处理函数。

    支持指向virtual member functions的指针

    float (Point::*pmf) () = &Point::z;

    Point* ptr = new Point3d;

    pmf一个指向member function的指针,被设值为Point::z()(一个virtual function)地址。

    ptr->z();  调用的是Point3d::z()。

    (ptr->*pmf)();   调用的也是Point3d::z() ,即虚拟机制仍然能够在使用“指向member function之指针”的情况下运行。

    对一个nonstatic member function取地址,将获得该函数在内存中的地址,而对一个virtual function取地址,所能够获得的只是一个索引值。

  • 相关阅读:
    git忽略已提交过的文件方法
    去除git版本控制
    写博客的初衷
    Substring with Concatenation of All Words
    Course Schedule
    Reverse Words in a String--not finished yet
    Repeated DNA Sequences
    Maximum Product of Word
    Odd Even Linked List
    Reorder List
  • 原文地址:https://www.cnblogs.com/sssblog/p/13719857.html
Copyright © 2020-2023  润新知