1、面向对象
面向过程的操作是以程序及基本功能是实现为主,实现之后就完成了,不考虑修改的可能性;面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用。
面向对象中有三大特性:
●封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
⑴保护内部的操作不被破坏,隐藏方法的内部的实现,仅仅提供一个调用的方法给其他人,让其他使用这个类的人不需要关心是如何实现的,只要关心如何调用;⑵封装类的属性,将类属性分成私有和公有属性,私有属性自身调用,公有属性仅提供一个外部调用的方法;⑶封装的作用:减少耦合
●继承:在原本的基础之上继续进行扩充,让某个类型的对象获取另一个类型的对象的属性和方法。通过继承创建的新类称为子类或者派生类,被继承的类称为基类或者父类。分为实现继承和接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力
●多态:同一个行为具有多个不同表现形式或形态的能力;指一个类的实例的相同方法在不同情形有不同表现形式。
作用:提高程序的复用性;动态创建对象时,可以动态调用子类的方法。??
多态的表现形式:继承和重写。
方法的多态,重载:相同函数名,不同的参数列表;(返回值不能作为重载的判断)
覆写:子类覆写父类相同方法名的函数
对象的多态:父子类对象的转换,向上转型和向下强制转型
五大基本原则
单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
替换原则LSP(The Liskov Substitution Principle)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
依赖原则DIP(the Dependency Inversion Principle)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类,而应当由B定义一个抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口,这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假设B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
接口分离原则ISP(the Interface Segregation Principle)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
2、类与对象的定义
一句话:类是对象的模板,对象是类的实例,类只有通过对象才可以使用
3、引用传递和值传递
引用传递:同一块堆内存空间,同时被多个栈内存所指向,不同栈可以修改同一块堆内存的内容
值传递:体现在基本数据类型作为参数进行方法调用时,原始值不受方法内值的修改而修改。
4、构造方法
⑴构造函数如果没有被显示的声明,那么对象在创建时候回调用默认的空参数的构造方法;
⑵构造方法的名称必须和类名相同
⑶构造方法只会在创建对象的时候被调用一次,调用完成后即出栈,而一般的方法可以在对象创建后被调用多次
⑷构造方法中,默认也是有return语句的,任何方法都是由return语句的,只是如果显示的写明,那么在编译后会自动加上
⑸构造方法前面如果加上返回值类型,那么它将变成一个普通方法(不推荐这种写法)
⑹构造方法可以加上权限修饰符,private,则可以用于单例模式
⑺构造函数可以被重载,一个类中可以存在多个不同参数的构造方法,构造方法没有返回值类型,没有具体的返回值
⑻构造方法之间可以调用,但是不能相互调用,即方法1和方法2互相调用,会导致内存溢出
网友评论