初识类和对象

1.类的定义         

class className
{
// 类成员
};  

类是一个类似于C语言中结构体的存在, 它能定义一个自定义的类型,类定义的关键字是class,关键字class定义的类与结构体的定义相似,class后接所定义类的名称,以及{},{}后也需要包含一个分号,在{}中报含了类的的组成成员,与结构体不同的是类的成员中可包含各种类型的成员,同时也包含结构体中不包括的函数,而在类中定义的函数为成员函数。

1.1类的成员函数                              

 在类中的成员函数有着两种定义的方式,这里需要单独拿出来介绍,在后续中类的学习我们会经常用到。

在类中声明定义:这种方式所定义的成员函数会被默认在函数前面加上 inline ,也就是说在类中声明定义的成员函数可能会被当做内联函数处理

在类中声明,类外定义:这种方式所定义的成员函数不会被函数前面加上 inline ,但是需要我们注意其定义,在类之外定义类的成员函数需要在其定义的函数名前加上该类名的引用,才能正常定义内中的成员函数。如:


2.类的访问限定符

 类的成员可被访问限定符所修饰,类的访问限定符共有三个,分别是:private、public 、protected ,被不同的访问限定符所修饰的类成员所具有的使用权限不同,其中被private、protected所修饰的成员,在类之外(也就是出了类的定义范围之外)是不能够被直接访问使用的,而被public所修饰的类成员是可以在类之外直接被访问使用的由访问限定符所修饰的访问为从该访问限定符出现的位置直到下一个访问限定符出现的位置为止,如果后面不再出现其他访问限定符,则知道类定义的作用域结束为止。

2.1类class和struct

 C++中的关键字struct在被兼容为定义结构体的关键字时,其同时可以定义类,也就是说,关键字class和struct都可以用来定义类,但是其两者在使用定义类是有所区别的,由关键字class所定义的类的成员默认被访问的权限是由private所修饰的,其成员在类之外不可以被直接访问,而由关键字struct所定义的类被访问的权限是由public所修饰的,其成员在类之外可以被直接访问。

3.类的实例化

类在定义这个过程,被称为类的实例化,类在定义类型的时候,是对类中所包含的成员对象的描述,这个过程中所定义的对象是没有分配空间来存储的,我们可以想象为相当于建房子时所设计的图纸一样,对房子布局的描述,在该过程并没有实体化出房子里面的东西,类在次过程可以看作是图纸的作用,而类中的各个成员则为图纸中所包含的对象,在定义的时候并没有实体化出来。


4.类的大小计算

类大小的计算与C语言中结构体的大小计算大致上有着相似的规则,但也有着不同的地方。让我们一起来看看吧

4.1类中的成员的储存模式

类中所包含的种类大体分为了两种,一个是成员变量,另一个是成员函数,其中成员变量的大小是被计算在类的大小之中的,而成员函数的大小是不包含在类大小计算之中的,这是因为考虑到每一个类对象的创建的时候,只有成员变量是不同的,而成员函数是相同的,也就是说,每个对象所调用的成员函数是相同的,而如果将成员函数分配给每个对象中,那么每个对象中就都会保存成员函数的相同代码,这就导致了空间的浪费,因此成员函数改为保存一份的公共代码区,每个对象中所存储的不是成员函数的定义代码,而是成员函数的存储地址,要使用成员函数就只需要通过成员函数的地址找到对应的成员函数进行调用即可。所以了大小的计算只需要计算成员变量的大小即可,同时也需要考虑C语言中相同的结构体的内存对齐。

4.2内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。其中VS中的默认对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍,该整数倍要大于或等于当前成员变量所对齐的内存偏移量。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

如: 

上面的类的成员变量的第一个类型为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指针的特性

  1. this指针是一个*const类型,也就是说this指针所指向的对象是不能被改变的。
  2. this指针只够在成员函数中使用。
  3. this指针不在对象的被存储,this指针的本质是调用对象实参的地址,通过调用对象的地址完成对对象成员变量的访问。

如上图我们可以看出在类函数中,我们可以直接引用对象的的成员变量进行访问,这就是因为this指针的存在,这个隐藏的指针参数this,编译器会通过它帮我们自动调用寻找成员变量,从而达到我们所见的直接访问,然而实际上是编译器帮我们完成了指针引用访问的这一操作,此外,我们可以在成员函数中,直接使用打印this指针,与调用成员函数的对象的地址对比,我们也能够发现两者的地址是相同的,这也证明了this其实就是调用对象实参的地址,只是我们不需要传递实参,编译器帮我们完成了这个隐形的操作。

结语

这节对于C++中类的初识了解到这里就结束了,下期将继续带来有关类的知识,感谢各位的观看,有错误或者需要改进的地方还请指出,如果有帮助的话,还请点个赞呀!大家互相学习,一起进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值