
1.类的定义classclassName{//类成员};类是一个类似于C语言中结构体的存在 它能定义一个自定义的类型类定义的关键字是class关键字class定义的类与结构体的定义相似class后接所定义类的名称以及后也需要包含一个分号在中报含了类的的组成成员与结构体不同的是类的成员中可包含各种类型的成员同时也包含结构体中不包括的函数而在类中定义的函数为成员函数。1.1类的成员函数在类中的成员函数有着两种定义的方式这里需要单独拿出来介绍在后续中类的学习我们会经常用到。在类中声明定义这种方式所定义的成员函数会被默认在函数前面加上inline也就是说在类中声明定义的成员函数可能会被当做内联函数处理在类中声明类外定义这种方式所定义的成员函数不会被函数前面加上inline,但是需要我们注意其定义在类之外定义类的成员函数需要在其定义的函数名前加上该类名的引用才能正常定义内中的成员函数。如2.类的访问限定符类的成员可被访问限定符所修饰类的访问限定符共有三个分别是private、public 、protected,被不同的访问限定符所修饰的类成员所具有的使用权限不同其中被private、protected所修饰的成员在类之外也就是出了类的定义范围之外是不能够被直接访问使用的而被public所修饰的类成员是可以在类之外直接被访问使用的由访问限定符所修饰的访问为从该访问限定符出现的位置直到下一个访问限定符出现的位置为止如果后面不再出现其他访问限定符则知道类定义的作用域结束为止。2.1类class和structC中的关键字struct在被兼容为定义结构体的关键字时其同时可以定义类也就是说关键字class和struct都可以用来定义类但是其两者在使用定义类是有所区别的由关键字class所定义的类的成员默认被访问的权限是由private所修饰的其成员在类之外不可以被直接访问而由关键字struct所定义的类被访问的权限是由public所修饰的其成员在类之外可以被直接访问。3.类的实例化类在定义这个过程被称为类的实例化类在定义类型的时候是对类中所包含的成员对象的描述这个过程中所定义的对象是没有分配空间来存储的我们可以想象为相当于建房子时所设计的图纸一样对房子布局的描述在该过程并没有实体化出房子里面的东西类在次过程可以看作是图纸的作用而类中的各个成员则为图纸中所包含的对象在定义的时候并没有实体化出来。4.类的大小计算类大小的计算与C语言中结构体的大小计算大致上有着相似的规则但也有着不同的地方。让我们一起来看看吧4.1类中的成员的储存模式类中所包含的种类大体分为了两种一个是成员变量另一个是成员函数其中成员变量的大小是被计算在类的大小之中的而成员函数的大小是不包含在类大小计算之中的这是因为考虑到每一个类对象的创建的时候只有成员变量是不同的而成员函数是相同的也就是说每个对象所调用的成员函数是相同的而如果将成员函数分配给每个对象中那么每个对象中就都会保存成员函数的相同代码这就导致了空间的浪费因此成员函数改为保存一份的公共代码区每个对象中所存储的不是成员函数的定义代码而是成员函数的存储地址要使用成员函数就只需要通过成员函数的地址找到对应的成员函数进行调用即可。所以了大小的计算只需要计算成员变量的大小即可同时也需要考虑C语言中相同的结构体的内存对齐。4.2内存对齐规则第一个成员在与结构体偏移量为0的地址处。其他成员变量要对齐到某个数字对齐数的整数倍的地址处。对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。其中VS中的默认对齐数为8结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍该整数倍要大于或等于当前成员变量所对齐的内存偏移量。如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。如上面的类的成员变量的第一个类型为int类型与VS默认对齐数相比更小对齐数为其自身类型大小先内存偏移量0对其到3共4个单位接着是char类型的数组其类型总的大小为10比VS默认对齐大所以其对齐数为8其最小对齐数的整数倍处为8自身类型为char从偏移量8处开始对齐对齐8-9接着嵌套的类我们只需要判断出其最大对齐数为4然后从对最小齐数整数倍12开始对齐对齐12-15,最后再判断类中所有成员变量的最大者与VS默认对齐大大小的最小的那个选取小的那个的最小整数倍这个最小整数倍要大于或等于当前对齐数此时为类的总大小。上面两者较小的为VS的默认对齐数8得到最小整数倍16大于当前对齐数15得到该类大小为16。4.3不含成员变量的类当一个类中不定义类对象或者定义的类对象只有成员函数也就是不含有成员变量时我们又如何计算类的大小呢这种情况是比较特殊的编译器会专门给类一个字节的空间来标识这一个类的存在也就是不含有成员变量的类的大小被默认定为一个字节大小。5.类成员函数中的this指针在类的成员函数中有一个隐藏的参数这个参数被称为this指针变量this指针所指向的对象为当前调用成员函数的对象这个参数是隐藏的不需要我们传递也不能传递其在对象调用成员函数的候 编译器已经帮我们完成了传递此外在成员函数中访问当前对象时可以直接引用成员变量编译器会通过this指针自动帮我们找到当前对象的成员变量。5.1this指针的特性this指针是一个*const类型也就是说this指针所指向的对象是不能被改变的。this指针只够在成员函数中使用。this指针不在对象的被存储this指针的本质是调用对象实参的地址通过调用对象的地址完成对对象成员变量的访问。如上图我们可以看出在类函数中我们可以直接引用对象的的成员变量进行访问这就是因为this指针的存在这个隐藏的指针参数this编译器会通过它帮我们自动调用寻找成员变量从而达到我们所见的直接访问然而实际上是编译器帮我们完成了指针引用访问的这一操作此外我们可以在成员函数中直接使用打印this指针与调用成员函数的对象的地址对比我们也能够发现两者的地址是相同的这也证明了this其实就是调用对象实参的地址只是我们不需要传递实参编译器帮我们完成了这个隐形的操作。结语这节对于C中类的初识了解到这里就结束了下期将继续带来有关类的知识感谢各位的观看有错误或者需要改进的地方还请指出如果有帮助的话还请点个赞呀