类对象模型

类—->实例化—->对象
类有大小(只包含成员变量大小),没有实际空间。空类大小为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为空,故崩溃


猜你喜欢

转载自blog.csdn.net/Romantic_C/article/details/81480503
今日推荐