赞
踩
存在三种:1.public
2.private
3.protected
2.2 对象大小
首先,对象里面有些啥?1.成员变量 2.成员函数。成员变量必然需要分配空间存储,但是成员函数就不需要。对于函数,在编译后是一段指令,无法存在对象里,而是存在代码段。我们只能存函数的指针,但是对于成员函数而言,我们实例化出100个对象时,每个对象都有一样功能的函数,一样的指针重复存储100次,就太浪费了。其实函数指针是一个地址,由于成员函数是类的一部分,它们的地址在编译时就已经确定,并且对于所有该类的对象实例都是相同的。这意味着,虽然每个对象实例的内存位置不同,但它们调用同一成员函数时,调用的函数体是相同的。种设计方式有助于节省内存,因为不需要为每个对象实例复制成员函数。
所以讨论对象大小,我们只需要看成员变量,对于c++的类任然遵循结构体内存对齐原则,我在之前的文章中讲过 点击链接结构体对齐 。
一个类中,当然不止会有一个对象,当存在多个对象时,在调用时,函数是如何知道该访问哪个对象呢?所以c++给了一个隐形的this指针。
- class A
- {
- public:
- void Print()
- {
- cout << this << endl;
- cout << "A::Print()" << endl;
- }
- private:
- int _a;
- };
- int main()
- {
- A* p = nullptr;
- p->Print();
- return 0;
- }
此代码,A.正常运行 B.运行崩溃
来看,在主函数里用类A定义了一个空指针,然后对空指针p进行解引用,引用A的Print函数,先打印this指针,因为是空所以这里打印出来是000000~,然后打印字符串。
在我们之前的学习中,可以知道如果对一个空指针进行解引用,是未定义行为,会产生崩溃。
但是在此题中,并不会运行崩溃,而是正常运行,选 A 。
在之前讲到,成员函数在编译后是一段指令,没有存在类对象里面,是通过this指针进行调用。在编译时通过函数名就确定了地址,不会在对象里面找,在底层并不会进行解引用。写出来是为了通过语法这一关,告知是在这个类里面的函数。
就会运行崩溃。
因为p的地址传给this指针后,进入函数,通过this解引用得到_a 就是空指针解引用。
是一样的。
分享到这。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。