C++对象原型

C++的对象在内存中是怎么表示的,数据成员和成员函数之间有什么关系,this指针究竟是干吗的。函数

这里不考虑虚函数表this

一个对象内存中占的大小其实就是他的数据成员的大小spa

   这是我用的例子指针

  

class T
{
public:
    T() {}
    void info() const {
        cout << "info\n";
    }
    void printValue() const {
        cout << "value is " << m_value << '\n';
    }
    void fun() const {
        cout << "fun!\n";
    }
private:
    int m_value;
};

注释掉fun函数和没注释的大小都是一个int的大小,4byte。

那么成员函数类是共用一份代码,可是咱们在使用的时候,为何感受是每一个对象都本身有一份,这和两个方面有缘由。咱们在施加一个动做给一个对象时,这个对象的状态只能由它的数据成员可以记录和表示,咱们在须要施加操做的对象身上由它的对象的数据成员所表明的状态是咱们预期的结果,是咱们感受是各自一份。还有就是this指针是形成假象的技术实现。code

int main()
{
    T *p = NULL;
    p->info();
//    p->printValue();
//    t *p2 = NULL;
//    info(p2);
    
//    cout << sizeof(T) << endl;
    
    
    return 0;
}

咱们在main函数中写了这段代码,你认为只是不可接受的,确实是,你不能对一个NULL执政施加操做,但是结果是

这样的对象

它很好的运行了。内存

如今咱们写了这一段代码原型

struct t {
    int m_value;
};

void info(const t *p) {
    cout << "info\n";
}

void printValue(const t *p) {
    cout << "value is " << p->m_value << '\n';
}

在main函数中写了这段

int main()
{
//    T *p = NULL;
//    p->info();
//    p->printValue();
    t *p2 = NULL;
    info(p2);

//    cout << sizeof(T) << endl;


    return 0;
}

其实这两个已经但是了解C++对象的原型了,p2就是this指针,它是NULL,不过咱们在info中没有使用它,因此它没什么影响,这就是第一段代码可以运行的缘由,但是若是咱们call了printValue函数,this是NULL,咱们在函数中访问了它的m_value,咱们省略了this->,这就和
void printValue(const t *p)
同样

一个内存段错误。
class

相关文章
相关标签/搜索