本节目标
一、面向过程和面向对象初步认识
二、类的引入
三、类的定义
四、类的访问限定符及封装
五、类的作用域
六、类的实例化
七、类的对象大小的计算
八、类成员函数的this指针
一、面向过程和面向对象初步认识
- C语言是面向过程的,关注的过程,分析出求解过程,通过函数调用来解决问题
- C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互来解决问题
二、类的引入
- C语言中结构体struct只能用来定义变量
- 但在C++中还可以定义函数
- 而在C++里面一般喜欢用class替代struct,二者差别不大
- 用struct或class定义的 就叫做类
三、类的定义
- class为定义类的关键字
- className为类的名字
- { }中为类的主体,注意后面加分号
- 类中的内容成为类的成员
- 类中的变量称作成员变量或类的属性
- 类中的函数称作成员函数或者成员方法
- 类有两种定义方式
- 第一种是类里函数的声明和定义全放在类里
- 注意:如果成员函数在类里定义,编译器则可能将其当成内联函数处理
- 第二种是成员函数声明放在.h头文件,成员函数定义放在.cpp文件
- 注意:其他文件来定义成员函数时,成员函数名字前需要加类名::
- 一般情况下,我们推荐使用第二种,尤其是大型工程项目时
四、类的访问限定符及封装
1.访问限定符
- C++实现封装,用类将对象的属性与方法也就是变量跟函数结合在一块,让对象更完善
- 然后加上访问限定符来选择是否让外部用户使用此类,是否将接口提供给外部用户
- 访问限定符一共有三种
- public公有代表类外成员可以访问,子类也可以访问 (子类涉及到继承,后面知识)
- protected保护代表类外成员不可以访问,但子类可以访问
- private私有代表类外成员不可以访问,子类也不可以访问
- 访问限定符只在编译时有用,当数据映射到内存中,没有任何区别了
- 相关面试题------C++中struct和class的区别时什么?
- 答:C++需要兼容C语言,所以在C++中struct也可以当作结构体来使用,还可以用来定义类,和class定义类是一样的,区别在于类里不写访问限定符的情况下,struct里默认访问限定符为public,而class里默认访问限定符是private,另外在继承和模板方面,也有一些区别
2.封装
- 相关面试题------面向对象的三大特性?
- 答:封装,继承,多态
- 相关面试题------在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
- 答:封装是将数据与操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外开放接口供其使用,和对象进行交互,封装本质上是一种管理,让用户更方便的使用类
五、类的作用域
- 类定义了一个新的作用域,类的所有成员都在此作用域里,在类外定义此类成员时,需要在前面加上::
- ::是作用域操作符,用来指明成员属于哪个类的作用域
六、类的实例化
- 用类的类型创建对象的过程,就叫做类的实例化
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间来存储成员
- 类就好比设计图,只有实例化才能变成图里面的东西
- 下图展示了如何实例化
七、类对象模型
1.如何计算类对象的大小
- 上图的类里既包含成员变量也包含成员函数,那么如何计算类里大小呢?
2.类对象的存储方式猜想
- 以下有几种类的存储方式猜想
- 实际上,类的存储方式就是
- 类成员函数存在公共代码区,这个代码区在哪儿,我们不用关心,编译器会帮我们找到
- 类成员变量存放在类空间内
- 如果这个类没有成员变量,那么它实例化出来的对象大小是多少呢?
- 大小结果为1,类实例化的对象大小不是应该为0吗
- 实际上,没有成员变量的类保留1个字节是为了占位,表示类对象存在,但是没存储数据
3.结构体内存对齐规则
- 相关面试题------结构体怎么对齐?为什么要进行对齐?
- 相关面试题------如何让结构体按指定的对齐参数进行对齐,能否按照3,4,5任意字节对齐?
- 相关面试题------什么是大小端,如何测试此机器是大端还是小端,什么场景考虑大小端?
八、this指针
1.this指针的引出
- 上面是用Date类实例化出的两个对象d1和d2
- 两个对象分别进行调用类里的成员函数时,它是如何区分是哪个类对象来调用它的?
- 事实上,C++中通过引入this指针来解决此问题
- C++编译器给每个非静态成员函数增加了一个隐藏的指针参数,让指针指向当前对象(函数运行时调用该函数的对象)
- 被调函数的函数体内的成员变量都是通过该指针去访问,只不过我们看不到,编译器隐藏了
- 例如 this->day = 10; this->month = 1; 我们只需要写day = 10,month = 1 即可,编译器自动在前面加this指针
2.this指针的特性
- 如图所示
- 相关面试题------this指针存在哪里?
- 答:this指针存在栈里
- 相关面试题------this指针可以为空吗?
- 答:this指针可以为空,但前提是不可以用this指针去访问成员变量,不可以解引用