最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 重温《Inside The C++ Object Model》(2) –Default-Constructor的建构操作

    //constructor/non-constructor的区分
    class Foo
    {
    public:
    //Foo():val(0),next(NULL) {}
    int val;
    Foo *next;
    };

    void foo_bar()
    {
    Foo bar;
    if ( bar.val && bar.next )
    {
    cout << bar.val << endl;
    printf("%p
    ", bar.next);
    cout << "Un initialization" << endl;
    }
    else
    {
    cout << "Initialization" << endl;
    }
    }

    带有Default Constructor” 的 Member Class Object

    (1)如果class A 内含有1个或1个以上的member-class-object, 那末class A 的每个constructor必须调用每一个member-classesdefault-constructor; 编译器扩大已存在的constructor, 在其中安插1些代码使得user-code在被履行前先调用必要的default-constructors.

    (2)C++语言要求以”member-objects 在 class 中的生命次序”来调用各个constructors.

     

    假定有以下类:

    class Dopey
    {
    public:
    Dopey();
    // … etc …
    };
    class Sneezy
    {
    public:
    Sneezy(int);
    Sneezy();
    // … etc …
    };
    class Bashful
    {
    public:
    Bashful();
    // … etc …
    };

    class Snow_White
    {
    public:
    Dopey dopey;
    Sneezy sneezy;
    Bashful bashful;
    // … etc …
    private:
    int mumble;
    };

    如果Snow_White没有定义default-constructor, 就会有1个non-trivial-constructor被合成出来依序调用Dopey, Sneezy, Bashfuldefault-constructors. 但是如果Snow_White定义了下面这样的default-constructor:

    Snow_White::Snow_White() : sneezy(1024)
    {
    mumble = 2048;
    }

    它会扩大:

    //编译器扩大后的default constructor
    //C++伪码
    Snow_White::Snow_White() : sneezy(1024)
    {
    //插入 member class object
    //调用其 constructor
    dopey.Dopey::Dopey();
    sneezy.Sneezy::Sneezy();
    bashful.Bashful::Bashful();

    //explicit user-code
    mumble = 2048;
    }

    带有Default Constructor” 的 Base Class

    在派生类中,如果同时存在member-class-object, 则先调用其base-class-constructor, 而后调用member-class-objectconstructor.

     

    带有1个Virtual Function” 的 Class

    以下的两种情况:

    (1)class 声明(或继承)1个virtual-function.

    (2)class 派生自1个继承串链其中有1个或更多的virtual-base-classes.

    都会有以下的扩大操作在编译期产生:

    [1]1个 virtual-function-table(cfront中被称为vtbl)会被编译器生成内放classvirtual-function地址;

    [2]在每个class-object1个额外的pointer-member(也就是vptr)会被编译器合成出来内含相干的class-virtual-function-table(class-vtbl)的地址.

     

    则假定有以下继承关系和代码:

    void flip(const Widget &widget)
    {
    widget.flep();
    }

    widget.flip()的虚拟引发操作会被重新改写以使用widget的 vptr 和 vtbl中的flip()条目:

    //widget.flip() 中的虚拟引发操作的改变
    (*widget.vptr[1]).(&widget);

    带有1个Virtual Base Class” 的 Class

    假定有以下继承关系与代码:

    class X
    {
    public:
    virtual void memFunction() const
    {
    cout << "In X" << endl;
    }
    };
    class A : public virtual X
    {
    public:
    void memFunction() const
    {
    cout << "In A" << endl;
    }
    };
    class B : public virtual X
    {
    public:
    void memFunction() const
    {
    cout << "In B" << endl;
    }
    };

    class C : public A, public B
    {
    public:
    void memFunction() const
    {
    cout << "In C" << endl;
    }
    };

    void foo(const X *px)
    {
    px -> memFunction();
    }

    int main()
    {
    foo(new X);
    foo(new A);
    foo(new B);
    foo(new C);
    }
    /*
    void foo(const X &rx)
    {
    rx.memFunction();
    }

    int main()
    {
    foo(X());
    foo(A());
    foo(B());
    foo(C());
    }
    */

    编译器没法固定住foo()当中”经过px而存取的X::memFunction()”的实际偏移位置由于px的真正类型可以改变编译器必须改变”履行存取操作”的那些代码使得X::memFunction()可以延迟至履行才决定下来;

    该功能则是靠”在派生类对象中的每个虚基类中安插1个指针(_vbcX [virtual-base-class-X])”完成所有”经过reference/pointer来存取1个virtual-base-class”的操作都可以通过相干的指针来完成.foo()函数可以改写以下:

    void foo(const X *px)
    {
    //__vbcX表示由编译器产生的指针, 指向virtual-base-class-X
    px -> __vbcX -> memFunction();
    }
    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » 重温《Inside The C++ Object Model》(2) –Default-Constructor的建构操作

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级