zoukankan      html  css  js  c++  java
  • Inside The C++ Object Model(四)

    ============================================================================
    4-1. Member 的各种调用方式
    静态成员函数(static member functions,不属于对象,没有this指针)不能直接存取Nonstatic数据;同时不能被声明为const(const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数——this指针由原来的Class* const变为const Class* const类型,使得在该成员函数内不能修改成员属性,除非该属性被mutable修饰)。
    数目各种调用方式

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



    名称的特殊处理
    编译器会把参数和函数名称编码在一起(函数特征标:函数名称+参数数目+参数类型),但是如果“返回类型”声明错误,就没办法检查出来。

    (2)Virtual Member Functions(虚拟成员函数)



    注:“经由一个class object调用一个Virtual function”,这种操作应该总是被编译器像对待一般的Nonstatic member function一样地加以决议。所以如下调用操作:
    // Point3d obj
    obj.normalize();
    会被编译器转换为:
    // 经由obj调用的函数实体只可以是Point3d::normalize()
    normalize_7Point3dFv(&obj);

    (3)Static Member Functions(静态成员函数)


    图片4-1-6;


    图片4-1-7;


    图片4-1-8;

    ============================================================================
    4-2. Virtual Member functions(虚拟成员函数)
    (1)我们已经知道Virtual function的一般实现模型:每一个class 有一个virtual table,内含该class 之中有作用的Virtual function 地址,然后每个object有一个vptr,指向Virtual table的所在。


    图片4-2-1;


    图片4-2-2;

    (2)多重继承下的Virtual table
    图片4-2-3;


    图片4-2-4;


    注:Sun编译器将多个Virtual tables 连锁为一个:指向次要表格的指针,可由主要表格名称加上一个offset获得(可以获得速度提升)。

    (3)虚拟继承下的Virtual Functions


    图片4-2-5;


    图片4-2-6;
    注:不要在一个Virtual base clas 中声明Nonstatic data members,否则,虚基类,虚函数和相关继承导致的各种offset调整所来的复杂性会让你犹如进入迷宫一般。


    ============================================================================
    4-4. 指向 Member Function 的指针
    (1)普通Member Function 指针


    图片4-4-1;

    //member function指针的声明语法:
    double (Point::*coord)();
    //指定其值
    coord = &Point::y;
    //调用.origin为Point对象
    (origin.*coord)(); // 或 (ptr->*coord)();
    // 此操作会被编译器转化为如下形式:
    // 虚拟C++码
    (coord)(&origin) // (coord)(ptr);

    (2)支持“指向Virtual Member Functions”之指针

    图片4-4-2;


    图片4-4-3;

    (3)在多重继承之下


    图片4-4-4;


    ============================================================================
    4-5. Inline Functions


    图片4-5-1;

    (1)形式参数


    图片4-5-2;

    (2)局部变量


    图片4-5-3;


    图片4-5-4;


    图片4-5-5;


    图片4-5-6;


    图片4-5-7;


    ============================================================================

  • 相关阅读:
    Docker初识
    57、android 应用内全局通知的实现方法
    56、使用android studio(v1.3.*)修改包名 (rename package name)
    55、android app借助友盟实现微信授权登录
    54、edittext输入类型限制为ip,inputType应该如何设置
    53、listview、expandableListview如何选中时保持高亮?
    52、sb犯的错误
    51、如何提取android代码中的字符串为系统资源文件 (I18N)
    50、转自知乎上android开发相见恨晚的接口
    49、android studio 使用技巧记录
  • 原文地址:https://www.cnblogs.com/yyxt/p/5995112.html
Copyright © 2011-2022 走看看