C++初阶2--3

简介: C++初阶2--3

C++初阶2--2 https://developer.aliyun.com/article/1424514

3-4,类对象模型

1,类对象的存储方式

       类存储的规则是这样的,类中的变量是存储在类中,但类中的函数没有存储在类中,而是存放在专门的类成员函数表中。如图:


70a2c81ba6414b61acf5128059a53fc4.png


       明白了以上知识后,我们需要注意的是以下代码。


#include <iostream>
using namespace std;
class A
{
public:
    void Print()
    {
        cout << "Print()" << endl;
    }
    void Print2()
    {
        cout << _a << endl;
    }
private:
    int _a;
};
int main()
{
    A* p = nullptr;
    p->Print();//此程序将正常运行,因为成员函数没有存储在类中
    p->Print2();//将运行崩溃,因为成员函数中有成员对象,成员对象在类中,此时类指针为nullptr
    return 0;
}

2,类的大小

       上面我们说过类的存储方式,那么一个类的大小,实际就是该类中”成员变量”之和,要注意的是内存对齐情况和空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。(内存对齐在之前C语言中结构体存储的那章博客上就有详细说明,在这里我们做简单的介绍,若有不明白的可观看本人之前的那章博客)。


内存对齐规则:


       1,第一个成员在与结构体偏移量为0的地址处。


       2,其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的对齐数为8。


       3,结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。


       4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


演练代码如下:

#include <iostream>
using namespace std;
class Person
{
public:
    void Student(char* name1, char* gender1, int age1);
    char name[20];
    int  age;
    char gender[3];
};
class Person1
{};
int main() {
    Person a1;
    Person1 a2;
    cout << sizeof(a1) << endl;//输出28
    cout << sizeof(a2) << endl;//输出1
    return 0;
}
相关文章
|
6月前
|
存储 编译器 C++
【C++ 初阶路】--- 类和对象(下)
【C++ 初阶路】--- 类和对象(下)
26 1
|
6月前
|
存储 编译器 C语言
【C++初阶路】--- 类和对象(中)
【C++初阶路】--- 类和对象(中)
29 1
|
6月前
|
安全 编译器 程序员
【C++初阶】--- C++入门(上)
【C++初阶】--- C++入门(上)
37 1
|
6月前
|
存储 编译器 C++
【C++初阶】—— 类和对象 (中)
【C++初阶】—— 类和对象 (中)
38 3
|
6月前
|
编译器 C++
【C++初阶】—— 类和对象 (下)
【C++初阶】—— 类和对象 (下)
28 2
|
6月前
|
C语言 C++
【C++初阶】—— C++内存管理
【C++初阶】—— C++内存管理
32 1
|
6月前
|
存储 编译器 C语言
【C++初阶】—— 类和对象 (上)
【C++初阶】—— 类和对象 (上)
36 1
|
6月前
|
C语言 C++ 容器
【C++初阶学习】第十二弹——stack和queue的介绍和使用
【C++初阶学习】第十二弹——stack和queue的介绍和使用
50 8
|
6月前
|
存储 C++
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
48 8
|
6月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
56 7