面向对象编程中的类和对象
面向过程编程:一步一步的去实现;
面向对象编程:点外卖,坐等着吃
在整个程序都是由一个一个的对象组成
对象是由数据结构+算法组成的,这个其实就是通过面向过程实现的!
C里面面向对象:是由结构体来实现的!
链表==》就是一个一个的结构体组成;除了设计了结构体,还有封装了一些函数(对链表进行增删改查的操作)。
什么是结构体: 为了描述一类事物的属性而自定义的一种数据类型!
学生:
属性: 学号、姓名、性别、出生日期、成绩。我们结构体只能描述属性,并不能把学生描述的活灵活现的,缺少行为。
行为:上课、吃饭、睡觉、做作业
访问: 变量名.属性名!
C++中的结构体与C中结构体的区别?
<1>.c结构体中不能有函数;而C++结构体中是可以有函数的!
<2>.c中空结构体的大小为0字节;C++中空结构体的大小为1字节
C中的结构体面向对象不彻底,C++中面向对象,就是把属性和行为整合在一起来完整的描述一类事物!可以用结构体,但是他有提供专门的一种数据类型类来表示的!
什么是类:为了描述一类事物的属性和行为而自定义的一种数据类型!
把属性和行为整合在一起 {}
类的关键字: class
格式: 上
Class 类名{属性;行为};
C++中的结构体: struct名字{属性;行为};
C++中有提供一个专门用来表示字符串的数据类型— string 类
C++中的类与C++中结构体的区别?
<1>.关键字不同: 类是用class 结构体用struct
<2>.初始化的方式是不一样的:
结构体的初始化是数据类型 变量名 = {};
但是类变量的初始化是不能按结构体的方式去做;
<3>.成员默认的权限是不同的:
结构体中成员的默认权限是 公共的 public
类中成员的默认权限是私有的 private
<4>结构体定义出来的变量就是变量;
类数据类型定义出来的变量叫 对象
补充:
C++中类成员的访问限定符有3种
public: 公共的,公有的 类的外部是可以直接访问的
private:私有的 类的外部是不可以访问的,类的内部是可以访问的!
protected:受保护的
什么是类的外部:{}外
什么是类的内部:{}内
什么是对象: 就是用类这个数据类型定义的变量;
类和对象的关系:
类这个数据类型是抽象; 对象是具体的。
类是对象的抽象;对象是类的具体实例!
例子:手机 我的手机
定义数据类型的时候,系统是不会给分配内存空间的,但是它是有大小的;只有在定义变量的时候才会按照这个数据类型的大小给变量分配内存空间!!!
面向对象编程有4大特性
抽象、封装、继承、多态
封装---面向对象编程中4大特性
面试题目: 谈谈你对封装的理解(谈谈你对面向对象编程的理解)
封装:把一类事物的属性和行为整合在一起,封装!
抽象:把一类事物的共同的属性和行为提取出来。
总结封装:
把一类事物的属性和行为提取出来,用自定义的数据类型 类 包在一起,该隐藏的隐藏起来,该暴露的暴露出来!
哪些是需要隐藏起来的:属性
哪些是需要暴露出来的:行为—接口
用面向对象的方式来描述 手机
属性:价格、品牌、颜色、运行内存、内存、像素的等等
行为:开机、关机、打电话、发消息、上网、拍照等
观察:不同的对象调用同一个函数,呈现不同的结果,为什么?
This指针的相关知识点
This:是这个的意思,它指的就是类对象的地址。
哪个类对象的地址:谁去调用成员函数,this指针的就是谁的地址!
总结this:
类的每一个成员函数中都有一个隐藏的参数this,参数的格式:
类名 *const this;
使用的时候,哪个对象来调用成员函数,this保存的就是哪个对象的地址;
在成员函数的实现过程中,如有访问到类自己的数据成员的时候建议加上this!
避免因为形参名字和数据成员名字相同造成数据混乱!
要访问类的成员,必需通过对象去访问;
普通对象+.成员;
指针类型的对象+->成员;
类中特殊的成员函数--构造函数
本质:是函数;
作用:在创建对象的时候,给对象分配内存空间并对数据成员进行初始化的。
何时调用:在创建对象的时候被调用的
谁调用: 系统自动调用
如果我们自己没有定义构造函数的话,系统会帮我们自动的创建一个空的构造函数;如果我们自己有写,走我们自己定义的构造函数!
定义的格式:
无函数类型 函数名和类名是一样的
函数名(参数列表){}
构造函数是可以重载的!
参数有默认值:
什么是默认构造函数:
<1>.构造函数无参的
一种是我们自己写的;一种是系统帮我们自动生成的
<2>.有参数的构造函数,并且所有参数都有默认值!
注意:在一个类中,默认构造函数只能存在一个!他们是互斥的关系!
如果后期想要修改或者获取类的私有的数据成员时,类外不能访问,就提供相应的成员函数!!!
注意如下的写法::
类中特殊的成员函数--析构函数
本质:函数
作用:在对象生命周期结束的时候,做资源释放回收的!特别是在堆区分配的空间一定要通过free或者delete去做释放!
何时调用:在对象生命周期结束的时候
谁去调用:系统自动去调用
析构函数如果我们自己没有定义,系统会帮我们自动生成一个空的析构函数;如果我们自己写了,会调用我们自己写的析构函数!
定义格式:
无参数类型 无参 函数名和类名是一样,前面要加上~
~类名(){}
析构函数是不能进行重载的!!!!
类对象的赋值,观察:
既然有执行析构,说明一定有执行构造函数!
拷贝构造函数
何时执行拷贝构造函数:
用一个已经存在的对象去初始化一个正在创建的对象的时候才会执行拷贝构造函数!
拷贝构造函数分为两种:
深拷贝 浅拷贝
什么是浅拷贝:
单纯的把一个类对象的数据成员值赋值给另外一个类对象的数据成员
存在的问题:
分析:
当myphone对象在释放的时候,p指向的堆区空间已经被释放了,再次释放p就会造成同一块堆区的空间被释放两次,就出现野指针
如何解决: 进行深拷贝
什么是深拷贝:
在拷贝构造函数中对指针类型的数据成员重新new分配空间,再把数据拷贝到堆区空间中!
分析原理:
什么时候进行深拷贝,什么时候进行浅拷贝:
如果构造函数里有在堆区开空间的话,要进行拷贝就需要进行深拷贝。
系统帮我们自动生成的拷贝构造是浅拷贝构造函数;如果要进行深拷贝,拷贝构造函数一定要自己去写!
类对象数组以及类对象指针数组:
以面向对象的方式实现一下登录界面