类—->实例化—->对象
类有大小(只包含成员变量大小),没有实际空间。空类大小为1(区分类对象)。
类的实例化
用类类型创建对象的过程,称为类的实例化
1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
2. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量
3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
类的对象模型
类的大小即成员变量的大小
类对象中只保存了成员变量,成员函数只单独保存了一份
问:对象中只保存了成员变量,成员函数只单独保存了一份,那成员函数如
何知道要设置那个对象?
1.先识别类名
(this指针,默认传参传this系统维护)
(this即被调用者,如上图中的S1,S2,S3)2.识别类的成员变量
3.识别类的成员函数,并进行改写(先加一个指针,而后修改赋值时的变量)
this指针特性
1.this指针的类型:类类型* const
2.this指针并不是对象本身的一部分,不影响sizeof的结果
3.this的作用域在类”成员函数”的内部
4.this指针是”类成员函数”的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递
5.只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以
_thiscall约定
1.__thiscall只能够用在类的成员函数上
2.参数从右向左压栈
3.如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定(_cdecl),this指针在所有参数被压栈后压入堆栈
4. 对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈
//下列代码运行结果?
class Test{
public:
void fun(){
_a = 10;
cout << _a << endl;
}
private:
int _a;
};
int main(){
Test* p = NULL;
p->fun();
return 0;
}
fun函数底层
void fun(Test* const this)
pt = NULL;即把NULL赋值给this,将this->_a = 10,this为空,故崩溃