第二章:类和对象(上)

目录

一、面向过程和面向对象:

二、类的初步理解:

三、类的创建:

四、类的成员函数:

4.1直接在类中创建成员函数:

4.2成员函数在类中的声明顺序:

4.3在头文件中声明类,在函数文件中定义成员函数。

五、类中的成员命名:

六、类的访问限定符和封装:

6.1访问限定符:

6.2访问限定符种类(权限):

6.3访问限定符的权限说明:

七、类的作用域:

八、类大小的计算:

8.1在一个类中,既有成员变量,又有成员函数,那么一个被实例化(创建)的类,他的大小是多少呢?

8.2空类的大小:

8.3复习结构体内存对齐:

8.4结构体对齐的原因:

九、this指针:

9.1一个类被实例化后,通过什么来唯一标识他,和其他被实例化的对象做区分?

9.2要点解析:


一、面向过程和面向对象:

        Cpp是一种基于面向对象的语言,他并不是纯面向对象的语言,由于他向下兼容C语言,所以它也是一种面向过程的语言。

        面向过程:要逐步完成,逐步调用函数。

        面向对象:创建类,通过对象交互实现功能。

二、类的初步理解:

  • 在C语言中定义一个结构体,需要使用struct;在使用结构体时,如果没有对结构体重命名,每次使用都需要加上struct;

        

  • 但是在cpp中,将结构体升级成了类,对类的创建无需再加上struct。

        

  • 类和结构体声明时是一样的,区别就在于:C语言的结构体内部不能定义函数,而在类的内部可以直接定义函数。

三、类的创建:

创建类和创建结构体大致相似:

  • class:创建类的关键字,也可以使用struct作为类创建的关键字,但是class更常用。
  • classname:类名,可以自定义,相当于变量的变量名。
  • 花括号中为类的主体,在花括号中创建的变量称为类的属性或者类的成员变量。
  • 在或括号中创建的函数成为类的方法或者类的成员函数。
  • 由于c++要向下兼容c语言,所以将struct升级为了定义类的一个关键字;使用class定义的类和使用struct定义的类唯一的区别就是默认访问权限的不同。这一点在后面说明。

四、类的成员函数:

  • 说明:在类的成员函数的创建中,一共有两种方法,一种是在定义类时一并定义函数;另一种是在头文件的类定义中声明函数,在.cpp函数文件中定义成员函数。

4.1直接在类中创建成员函数:

        首先说明,这种方法不常用。

        原因是,在定义类时直接定义成员函数,会使得成员函数可能被编译器当作内联函数处理,导致无法在符号表生成地址,导致该函数无法在同一个工程的其他文件中被调用。

4.2成员函数在类中的声明顺序:

        正常情况下,如果变量1要调用变量2;就需要变量2在变量1前面声明或定义。因为编译器会向前查找,不会向后查找。

        由于定义一个类就相当于定义了一块作用域,这块区域中的成员相互调用不会受到声明先后的影响。只要成员存在于类的区域中,就无需考虑声明的先后顺序。

4.3在头文件中声明类,在函数文件中定义成员函数。

        这种方法定义的类函数,会在汇编阶段生成符号表时,为类函数在符号表中生成符号和分配地址,这样就可以在除了定义所在的文件以外的其他文件中调用了。

五、类中的成员命名:

  • 类中的成员可能和全局的变量名字相同,我们在调用时,如果不仔细查看,有时可能会分不清被调用的是类中的成员还是全局的成员。
  • 因此,我们可以对类的成员加一个标志来和全局变量做区分。
  • 一般会在类的成员名前或者后面加上下划线,但是也不唯一,可以加自己喜欢的标志做区分。

        

六、类的访问限定符和封装:

6.1访问限定符:

        c++用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性将接口提供给外部用户使用,防止一些安全问题,也可以防止用户错误的使用导致产生不符合预期的结果。

6.2访问限定符种类(权限):

  • 公有-public
  • 私有-private
  • 保护-protected

6.3访问限定符的权限说明:

  • public修饰的类成员,可以在类外面被直接访问。
  • protect和private修饰的类成员,在类外不能够被直接访问。
  • 一个访问限定符的作用域,在他出现到下一个访问限定符出现为止。
  • 如果一个访问限定符的后面再未出现访问限定符,那么他的作用域就到  }  为止。
  • 使用class定义的类默认权限为private
  • 使用struct定义的类默认权限为public

七、类的作用域:

        定义一个类,相当于定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员时,需要使用作用域限定符指明该成员属于哪个类。

        

八、类大小的计算:

8.1在一个类中,既有成员变量,又有成员函数,那么一个被实例化(创建)的类,他的大小是多少呢?

  • 每个被创建的类,他们的成员变量是不同的,但是可以调用同一份函数。所以只为类的成员变量开辟空间。不需要为成员函数开辟空间,这样可以避免冗余。
  • 成员函数会单独为其开辟一块空间,称为公共代码区,供给每一个被实例化后的类来函数调用。
  • 可以理解为:在一块很大的地方,有一座座别墅,每一个被实例化的类就相当于一座别墅,而类中的成员函数就相当于物业。无需为每一座别墅设置一个物业,所有别墅共用一个物业即可。
  • 所以,类的大小就是他里面成员变量的总大小,具体大小经过内存对齐计算。

8.2空类的大小:

  • 说明:如果一个类中没有成员变量或者仅有成员函数,那么他的大小为1。这是因为编译器会给空类一个字节来唯一标识这个类的对象,证明他存在。

8.3复习结构体内存对齐:

  • 结构体第一个成员在偏移为0位置处。
  • 其他成员要对齐到对齐数整数倍处。对齐数取成员大小和默认对齐数中较小的一个
  • 结构体的总大小为最大对齐数的整数倍。

8.4结构体对齐的原因:

  • 对齐可以提高访问效率,如果不对齐就要涉及数据拼接问题。

  • cpu读取空间时,不是一个字节一个字节读取,而是每次读取多个字节;
  • 如果不设置对齐数,当一个变量处在两块cpu读取的区域,就要被读取两次并拼接。设置对齐后,在浪费一些空间的情况下,可以提高cpu对数据的处理能力。

九、this指针:

9.1一个类被实例化后,通过什么来唯一标识他,和其他被实例化的对象做区分?

c++编译器引入this指针解决此问题,他为每一个“非静态的成员函数”增加了一个指针参数,每创建一个对象,就创建一个指针,指向对被实例化后的对象。对函数体中的成员变量操作,都是通过该指针访问的。

9.2要点解析:

  • this指针的类型为* const,所以可以为其赋值不能改变其地址。
  • 只能在成员函数的内部被使用,不会显示在参数位置,也不能在参数位置被显式使用。
  • this指针存储在栈帧里面,并非存储在对象里面。
  • this指针是成员函数的第一个隐式的指针形参,一般用ecx寄存器传递。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S+叮当猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值