zoukankan      html  css  js  c++  java
  • C ++ 对象模型学习记录(4) function 语义学 (未完待续)

    1. C++中支持 3中成员函数: static ,非static,和 virtual 函数,两种数据成员,static和非static的

    2. member的各种调用方式

       非static成员函数,在C++中,所有的非 static成员函数都被转化为一个全局的成员函数,并隐式的传给了一个class 的对象的指针,而且选择成员函数的效率与全局函数的效率相同,没有任何负担

      虚成员函数的调用, 将会被转化为 一个指针指向vptr,而vptr指向virtual 函数表

     例如:如果是对 

        ptr->normalize(),normalize() 是一个 虚成员函数,将会在内部转化为 (*ptr->vptr[1])(ptr),

      静态成员函数,如果normalize()是一个static member 函数,则:

       obj.normalize()和 ptr->normalize()将会被转化为 一般的函数条用,因为static的存储在class object 之外, normal_Point3dsfv() 

       而由于static的修饰作用,使得它不能使用对象的指针

       (1) 不能够直接存取其class中的非static member ,在static的作用域范围内,要想访问非static的数据成员,就得使用this指针

          

    #include <iostream>

    using namespace std;
    class A
    {
    public:
    A(
    int a)
    {
    this->a = a;
    }
    static int f()
    {
    //error: invalid use of member 'A::a' in static member function
    //return a;
    }
    private:
    int a;
    };
    int main()
    {
    A a(
    4);
    int i = a.f();
    return 0;
    }

      其实使用成员函数也不行:

    #include <iostream>

    using namespace std;
    class A
    {
    public:
    A(
    int a)
    {
    this->a = a;
    }
    static int f()
    {
    //error: invalid use of member 'A::a' in static member function
    //return a;

    int i = this.g();
    return i;
    }
    int g()
    {
    return a;
    }
    private:
    int a;
    };
    int main()
    {
    A a(
    4);
    int i = a.f();
    return 0;
    }

      

        (2) 不能被声明为const,volatile,或者 virtual(需要用到this指针)

        (3)不需要经过object 调用,可以使用class直接去调用 

      static 成员函数,可以成为 callback 回调函数

    3. virtual 成员函数 ,考虑单继承,多继承和虚拟 继承的情况 

  • 相关阅读:
    HTML <h1>
    HTML <body> 标签
    如何挑选深度学习 GPU?
    视频动作定位的分层自关注网络:ICCV2019论文解析
    三维点云去噪无监督学习:ICCV2019论文分析
    摄像头定位:ICCV2019论文解析
    深度学习扫地机器人
    细粒度语义分割:ICCV2019论文解析
    目标形体形状轮廓重建:ICCV2019论文解析
    2-2.5-3D的室内场景理解
  • 原文地址:https://www.cnblogs.com/hitwtx/p/2162644.html
Copyright © 2011-2022 走看看