C++的对象在内存中是怎么表示的,数据成员和成员函数之间有什么关系,this指针到底是干嘛的。
这里不考虑虚函数表
一个对象内存中占的大小其实就是他的数据成员的大小
这是我用的例子
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指针是造成假象的技术实现。
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)
一样
一个内存段错误。