引言
小伙伴们,当你们看到这章的时候,显然你们已经跨过了来自指针给你们带来的麻烦,唔~真棒呢,但是我们只学会一些基础的C++语法并不能帮我们解决问题,甚至是稍微难一些的题目我们都没办法解决,那怎么办呢,我想已经有小伙伴知道了,那就是用C++的语法用面向对象的方式去写代码。
我们之前写的代码都是以一种面向过程的方式编程,这是针对一种问题的解决所写出来的程序,在面临越来越多的代码工程来说,这样的编程方式有点慢了,不要怕,这时候就出现了面向对象化编程,他能在很大程度上拓展我们的解决问题的范围。那到底面向对象化编程是什么呢,它和我们之前学的面向过程化编程有什么区别呢让我们一起来看看吧~
面向过程编程
定义:
面向过程编程(Procedure-oriented Programming,POP)是一种编程范式。
它强调的程序是一系列按照顺序执行的步骤或过程,重点在于编写一系列的函数或者过程来完成具体的任务。在面向过程编程中,数据和对数据的操作上是分离的,通常先定义数据结构,然后编写函数来处理这些数据。
核心思想就是以功能为中心,专注于问题的解决,将整个需求分解为若干个步骤,每个步骤定义为一个函数,通过逐步调用函数来实现整个需求。
- 例如小杨同学早上开宝马去上学,面向过程编程可以梳理为如下步骤:
特点:
- 以函数为最小单位,强调的是功能行为,主要考虑怎么做(算法)。
- 面向过程=数据+算法,对于给定输入经过函数处理返回结果(IPO: Input Process Output)。
优缺点:
- 优点:
符合人类思维,各代码块分工明确,需要实现的功能拆分的清晰明了。逻辑清晰、流程明确,对于小型程序或简单任务较为高效。 - 缺点:
数据和处理数据的函数是相互分离的。对于大型、复杂的系统,其可维护性和可扩展性可能会受到一定限制。- 当数据结构改变时,所有和该数据结构有关联的函数都要修改,程序的可维护性差。
- 函数功能太固定,不易于复用,不容易扩展。
面向对象编程
定义
面向对象编程(Object-Oriented Programming,OOP)也是一种基于对象概念的编程范式。
在面向对象编程中,程序由对象组成,对象是包含数据(属性)和操作这些数据的方法(行为)的实体。对象之间通过发送消息来相互交互和协作。
面向对象编程考虑的核心是将需求中涉及的事物找出来,将事物的数据抽象为属性,行为抽象为方法,再将属性和行为封装在一起形成类型,这些类所产生的对象相互协作完成需求。
- 例如小杨同学早上开宝马去上学,面向对象编程可以梳理为如下步骤:
特点:
- 面向对象编程以类为最小单位。
- 面对象编程=类+对象+消息(对象调用属性或方法),其中核心是类与对象。
面向对象中的基本概念
封装
将对象的属性和方法封装在一起,对外只提供必要的接口,隐藏内部实现细节。
- 类, 描述了一组具有相同特征(属性)和相同行为(方法)的对象。比如、汽车,书,苹果等。
- 对象,是现实世界实际存在的事物,是类的一个具体示例。例如,某一辆宝马,《三体》,正在吃的那个苹果。
- 属性,类中的特征(数据)称为类的属性(数据成员)。例如,汽车的颜色,品牌,车牌号码;书的作者、单价、页数;苹果的颜色、大小、品种、甜度等。
- 方法,类中行为(函数)称为类的方法(成员函数)。例如,汽车加速,启动,停车等。
继承:
继承允许创建一个新的类(子类),该类可以从现有的类(父类)中继承属性和方法。子类可以扩展和修改父类的功能,同时还可以添加自己特有的属性和方法。通过继承,可以实现代码的复用,减少重复编写相同的代码,提高开发效率。
多态:
多态分为编译时多态和运行时多态。
编译时多态通常通过函数重载来实现,即相同的函数名可以有不同的参数列表,在编译阶段根据参数的类型和数量来决定调用哪个具体的函数。
运行时多态通过虚函数来实现。当子类重写了父类的虚函数时,通过父类的指针或引用调用虚函数,实际执行的是子类中重写后的版本,从而实现了在运行时根据对象的实际类型来决定调用的方法。
多态使得程序具有更好的灵活性和可扩展性,能够更方便地处理不同类型但具有相似行为的对象。
代码示例:
这里先提前露一下明天要说的内容,这是一个代码示例,他把需要用的功能和属性都放在了类中,分成模块,可以让一个团队分工合作,而不是一个大佬库库敲整个代码程序区。
- 面向对象编程的主函数:
int main()
{
// 定义(创建)Rect类的对象r。
Rect r, r1;
// .操作符访问成员,可以访问数据成员或成员函数。
r.setLength(2);
r.setWidth(3);
cout << r.getArea() << endl;
cout << r.getPerimeter() << endl;
// 多个对象之间的属性互相独立。
r1.setLength(1);
// 函数成员参数可以有默认值
r1.setWidth();
cout << r1.getArea() << endl;
cout << r1.getPerimeter() << endl;
return 0;
}
结语
今天的内容算是个开胃前菜,给大家先说说有关面向对象编程的内容,有关具体内容,由于篇幅较长,需要展开来说,所以就放在下一章来说,不过这一章单独拿出来也不是只是因为这个。
很多人说小杨这个我只会面对过程编程可以么,我说不太行,因为我们未来一定是团队合作,如果一群人来改一份文档,还有各个变量,相比想要完成一个合格的项目是很难的,所以我们一定要学会面向对象化编程。
好了,小伙伴们加油呀,一定要紧跟着小杨的步伐,冲冲冲!!!!