面向对象理解

时间:2022-11-13 17:21:23

      什么是面向对象?

      面向对象是一种思想,是相对于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。

      面向对象,将数据和行为封装在一起,侧重点是数据,方法是数据的行为的描述。面向过程侧重于方法。

      1、面向对象的特点

      面向对象有三大特征:封装性、继承性、多态性。

      其中封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性

      对于继承性,就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。

      多态是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性,但是多态有一点不好之处在于:父类引用不能访问子类中的成员。

      2、面向对象和面向过程的区别

      问:经常听到有人说,计算机语言可以归为面向过程语言和面向对象语言,那么到底什么是面向对象,什么是面向过程呢?

      答:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

      可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

      如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

      可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

      3、C和C++ struct的区别

      C语言struct只是结构体,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。它只能包含成员数据,不能包含成员函数。

      C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它具有class一切的功能:成员数据、成员函数、构造函数、继承、多态。

      4、C++中struct和class的区别

      对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

struct{
int a ;
char b ;
float c ;
}x,y[20],*z;


      C 语言中struct一些知识点

      struct  tag {member-list } variable-list ;

      为什么要有tag和variable-list,tag的作用是结构体的名字,用于定义变量;variable-list如果没有typedef只是结构体实例,如果加了typedef就是类型名,可以用来实例化结构体,此时tag也是有作用的,用于在结构体内部定义同类型指针。

实例一:

struct{
int a ;
char b ;
float c ;
}x,y[20],*z;
上面定义了实例化了x,y[20],*z ,由于没有声明结构的名字,后续就没有办法再定义该结构实例。

实例二:

struct SIMPLE{
int a ;
char b ;
float c ;
};

struct SIMPLE x ;
struct SIMPLE y[20],*z ;
必须加struct,C++中可以不加

实例三:

typedef struct {
int a ;
char b ;
float c ;
}Simple;

Simple x ;
Simple y[20],*z ;
此处的Simple并不再像“实例一”中的实例化的结构了,也不是实例2中的tag,他是一个类型名称。所以不用再加struct。

实例四:

typedef struct {
int a ;
SELF_REF3 *b ;
int c ;
}SELF_REF3 ;
这是错误的,因为上面结构中的SELF_REF3的定义在代码的最后面,所以结构内的未定义。

修改后如下:

typedef struct SELF_REF3_TAG{
int a ;
struct SELF_REF3_TAG *b ;
int c ;
}SELF_REF3 ;

实例五:

我们前面举的例子只用到了简单的类型,其实外部成员可以定义的结构内的成员都可以定义

struct COMPLEX{
float f ;
int a[20] ;
long *lp ;
struct SIMPLE s ;
struct SIMPLE sa[10] ;
struct SIMPLE *sp ;
};

实例六:

会造成递归,进入死循环,将其改成指针就没问题了,因为指针不暂用实际内存,没有创建实体。

struct SELF_REF1{
int a ;
struct SELF_REF1 b ;
int c ;
};