Luckyscript's Blog
  • virtual method table in C++

    最近闲逛v2ex的时候,发现了这么一个帖子:求助 C++大神看一个问题

    点进去一看代码,一脸懵逼,这是啥。。。

    class B {
    public:
        virtual void foo() {}
    };
    class D: public B {
    public:
        D() : mA(0) {}
        virtual void foo() {
            cout<<"D::foo::mA "<<mA<<endl;
        }
        int mA;
    };
    int main() {
        D d1;
        D* pD = &d1;
        cout<<pD<<endl;
        typedef void (*PFun)();
        PFun fun =  (PFun)((long *)*((long *)*(long*)(pD))); //???
        fun();
        cout<<"D::pD::mA: "<<pD->mA<<endl;
    }
  • C++ keyword extern

    extern关键字在C++中通常有三个作用

    存储类指定符

    extern作为存储类指定符的时候,被声明的对象具有静态存储期。 所谓静态存储期就是和static以及全域变量一样,在程序的运行周期都存在。

    // extern.h
    extern int e;
    // extern.cc
    int e = 0;
    //main.cc
    #include "extern.h"
    void fun()
    {
        e++;
        cout << e << endl;
    }
    int main()
    {
        fun();
        fun();
    }

    运行这段代码:

    $ g++ extern.cc main.cc
    $ ./a.out
    1
    2
  • C++ rvalue

    左值和右值

    int a = 3;
    // a is lvalue, 3 is rvalue

    学C的时候,对左值的概念是既能出现在表达式等号左边,又能出现在右边的变量;右值是只能出现在等号右边的量。 但是C++中,这两个的定义更加晦涩一点。《C++ primer》中这样定义这两个的差别

    当一个对象被用作右值得时候,用的是对象的值;当对象被用作左值得时候,用的是对象的身份。

    这个定义还是略显抽象,但是我们可以看出,我们往往关注表达式中的左值所代表的内存地址,对于右值,我们更关注这个值是多少。 同样,C++中,左值可以当做右值对象用,但是右值不能当成左值用。当一个左