面向对象是一种编程范式,与面向过程相对,代表一种以数据(对象)为单元的对现实世界的抽象方式。用程序描述"我吃饭"。面向过程的写法:eat(I, food),面向对象的写法:I.eat(food)。两者最直观的区别是程序的组织方式不同,面向过程的程序以动作(函数)为构建单元,通过在函数中调用其它函数完成对现实世界的描述。面向对象是以数据(名词)为核心,通过对象之间的消息传递构建程序。面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类。OC语言是面向对象的,c语言是面向过程的。
面向对象更符合人类对现实世界的认知,人对抽象的“类”和具体的“对象实例”这些概念从童年起能有很好的理解,例如 "人类"就是一个抽象的 class,而"张三"就是一个属于"人类" class 的 object。总结来说就是把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)/泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch)。
面向对象的编程方法具有四个基本特征:抽象,封装,继承和多态。能够避免命名冲突、实现代码复用,对于构建大型程序十分有利。
抽象是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。继承性很好的解决了软件的可重用性问题。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。多态是依赖于接口的。
但是,在C++使用OOP的编程方式在一些场合未能提供最高性能。现在内存存取成为计算机性能的重要瓶颈,这个问题在C++设计OOP编程范式的实现方式之初并未能考虑周全。现时的OOP编程有可能不缓存友好(cache friendly),导致有时候并不能发挥硬件最佳性能。大概就是过度封装,多态增加cache miss的可能性,数据存取时导致载入缓存的浪费等。
面向对象相对于面向过程来说,它从现实世界中客观存在的事物(即对象)出发来构造软件系统,并根据这些事物的本质特点,把它们抽象地表示为系统中的基本构成单位,更能接近现实事物本来的特性和面貌。
面向对象优点:
1.一切皆对象,相对于面向过程编程而言提高了代码的可重用性;
2.面向对象的三个重要特征:封装、继承、多态,提高了系统的灵活性与健壮性;
3.面向对象的中的属性和方法的可访问性提高了程序的安全性,数据调取的多样性.