面向对象总结

1. 面向对象=对象+类+继承+通信

2. 对象是面向对象开发模式的基本成份。每个对象可用它本身的一组属性和它可以执行的一组操作来定义。属性一般只能通过执行对象的操作来改变。操作又称为方法或服务,它描述了对象执行的功能,若通过消息传递,还可以为其它对象使用。

3. 消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。一个对象接收到消息则调用消息中指定的方法,并将形式参数与参数表中相应的值结合起来。

4. 类是一组具有相同数据结构和相同操作的对象的集合。类的定义包括一组数据属性和在数据上的一组合法操作。类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。同一个类的每个对象都是类的实例 (Instance),它们都可使用类中提供的函数。对象的状态则包含在它的实例变量,即实例的属性中。

5. 继承是使用已存在的定义做为基础建立新定义的技术。新类的定义是基础类所声明的数据和新类所增加的声明的组合。新类复用既存的定义,而不要求修改既存类。既存类可当做基类来引用,则新类相应地可当做派生类来引用。

6. 面向对象的特点:封装(Encapsulation):通过定义类实现;继承(Inheritance):通过派生新类实现;多态性(Morphism):虚拟函数实现。

7. 函数:完成特定功能的一段代码;具有合法的名称;具有一定返回类型;可以多次调用。

8. 参数的传递:值调用、地址调用、引用调用、参数的求值顺序。

9. 重载:具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。

10. 函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。

11. C++的类是对象的抽象:数据成员、成员函数。

12. 类的结构(外部说明):访问控制描述符:

public后声明的是公有数据成员和成员函数,可被任何程序单元引用。

private后声明的是私有数据成员和成员函数,仅可被类内部引用。

public和private出现的顺序和次数是任意的。

13. 类的结构(内部实现):类成员函数的实现

返回类型 类名::成员函数名(参数声明){语句序列;}

14. 类的实例化--对象的实现

一般语法: ----类标识符 对象标识符;

可以声明多个对象,对象之间代码共享,数据独立。可使用对象名引用对象的公有成员函数。方法如下:------对象名.成员函数名(参数列表);

15. 类的实例化—对象的实现:成员函数所操作的数据成员是该类的某个对象的数据成员。(注:将一个标识符与一个程序实体相关联的过程称绑定。分静态和动态绑定两种。静态绑定在编译时进行,动态绑定在运行时进行。)

16. 构造函数和析构函数:构造函数的作用是在对象被创建时使用特定的值构造对象(初始化)。析构函数的作用是在对象被删除时做一些清理工作。构造函数与类同名。析构函数是类名前加~。两者无返回类型,析构函数无参数。

17. 成员函数的内联实现:(1)函数体放在类体内;(2)函数体放在类体外,使用inline关键字。

18. 带缺省参数值的成员函数和成员函数重载

19. 作用域:一个标识符的有效区域。分为:函数原型作用域、块作用域、类作用域、文件作用域。(1)函数原型作用域:函数原型中所作的参数声明在该作用域,始于左括号(,结束于右括号)。(2)块作用域由一对花括号定义。(局部作用域)

20. 可见性:标识符是否可以引用。在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。C++中,标识符必须先声明后引用,在同一作用域中不能声明同样的标识符。

21. 对象的生存期:(1)静态生存期:与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变;文件作用域或用static指定。若未显式指定初始值,为零。(2)动态生存期:在函数内部(块作用域)声明的对象是动态生存期。若未显式指定初始值,为任意值。

22. 数据共享的方法:数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。数据存储在全局对象中,通过全局对象进行数据交换。封装在类中。全局对象存在的问题:可见性无限制、不能保证操作的合法性。解决上述问题的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。

23. 指针:对象的地址;指针对象:存放指针的对象。一个指针对象被赋值为一个对象的地址后,称指针指向对象。

24. 数组:一组类型相同的对象。数组元素也可以用指针引用。通过指针引用数组元素:定义指针对象;数组的地址赋值给指针对象。指针引用数组元素的方法:*(pointer + n)或pointer[n]

25. 对象数组:没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。

26. 引用:是标识对象的一种机制(是对象的一个别名)。一般用作参数类型、函数返回类型。一般语法如下: --基本类型& 标识符。一个引用不是独立的对象,只是对另一个对象的引用。--基本类型& 标识符=对象;

27. 栈对象与堆对象:在程序运行中根据需要在堆内存中创建的对象,使用完成后随时被删除。删除语法如下:---delete ptr;;数组对象的删除 delete[] ptr;

28. this指针:一个成员函数被调用时,被自动传递一个隐含的参数,该参数是一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。

29. 操作符重载:当使用操作符来表达对对象的某个操作时,可以将操作符函数声明为类的成员函数或类的友员函数。操作符的参数个数、优先级、结合性和使用语法是由C++规定的,不能被改变。重载操作符的形参不能具有缺省值。重载操作符的返回值类型任意,但最好不是void 。

30. 两种方法的比较:一元函数最好重载为成员函数;二元函数一般重载为友元函数:27.5+x。赋值操作符只能重载为成员函数:27.5=x。++和--操作符有两种形式,一般被重载为成员函数。其中后缀操作重载后带有一个整型参数。下标操作符只能被重载为成员函数

函数调用操作符可以看作是下标操作符的扩展。

31. 继承与多态性:通过已有的类进行扩展产生新类的过程;产生的新类称派生类;产生派生类的类称基类或父类。从一个基类派生称单基继承,从多个基类派生称多基继承。

32. 单基继承的语法:class 派生类名:访问控制 基类名{数据成员和成员函数

声明;}

多基继承:class 派生类名:访问控制 基类名1,访问控制 基类名2…{同上;}

33. 访问控制用于控制基类中声明的名字在多大的范围内能够被派生类的用户访问

访问控制有三种public,protected,private

其他程序模块:基类模块、派生类模块、间接派生类模块。

34. 多继承:可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。

35. 派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。

一般形式如下: ----C::C(参数表0):C1(参数表1),C2(参数表2),…,Cn(参数表n) 如果冒号右边的某个基类的构造函数参数表为空,则可以省略该项。构造对象时,先执行基类的构造函数,然后执行派生类的构造函数,析构时则相反。多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中的顺序无关。

36. 如果派生类的一个表达式引用基类中不止一个成员,则存在二义性。 解决二义性的办法是加类限定符。

37. 虚基类:为避免一个基类在多条继承路径上造成在派生类中产生多个基类子对象,可以采用虚基类技术。

38. 拷贝构造函数:用一个对象初始化一个正在建立的同类对象。拷贝构造函数的参数是引用参数。每个类都有一个拷贝初始化构造函数。如未定义,则编译器自动生成一个。功能:用作为初始值的对象的每个数据成员初始化正建立对象的对应的数据成员。

39. 赋值:当需要进行对象之间的赋值操作时,必须定义赋值操作。为与习惯一致,一般用作为=赋值操作符。当使用操作符作为函数名时,必须与关键字operator合用。赋值操作的参数最好用引用方式。赋值操作的参数最好采用引用方式。赋值操作的最好返回对被赋值对象的引用。一般形式:X& X::operator=(const X& p);

40. 派生类的赋值和初始化:如未定义拷贝构造函数和赋值操作,则编译器提供。如自定义,则应在实现中调用基类的拷贝构造函数和赋值操作。

41. 虚函数与多态性:如果类型S是从类型T共有继承的,则称类型S是类型T的子类型。类型S的指针或引用可以适用于类型T的指针或引用的场合。

42. 动态绑定与虚函数:由于在基类和派生类中,相同的名字执行的操作可能不同,所以基类的成员函数在派生类中经常有不同的实现。用virtual关键字可以实现动态绑定。动态绑定只适用于虚函数的参数是指针或引用的情况。 在一个成员函数内调用虚函数时,对该虚函数的调用进行动态绑定。

派生类中虚函数必须满足下列条件:与基类的函数有相同个数的参数;参数类型相同;返回类型或者与基类相同或者返回指针或引用,且返回的指针或引用的基类型是基类中对应函数所返回的指针或引用的基类型的子类型。 在一个成员函数内调用虚函数时,对该虚函数的调用进行静态绑定。

43. 纯虚函数与抽象类:当定义基类时某个虚函数不能给出确定的实现时,可以定义其为纯虚函数。语法如下:virtual 类型 函数名(参数列表)=0。具有纯虚函数的类称为抽象类,抽象类只能用来派生类而不能定义具体的对象。

 

第二篇:面向对象总结

面向对象总结

下面只是我个人对面向对象的一点理解,希望大家多提意见。 向对象有这么几个好处:

可维护;可拓展;可复用。

首先我们要知道一点,不是在程序中用到了封装、继承、多态就是面向对象的设计。面向对象的设计是会用到三大特性,但是应该根据需求合理的来应用它们,这才会发挥面向对象的好处。

我们在设计时,首先要把程序的各个功能都相互隔离,比如界面和业务要相分离,业务和访问数据库相分离,又比如把每个具体的业务封装成类。在划分类时,我们就要注意了,一个类只要能做一件事就行了,像DBHelper就只专注做连接数据库,不去做注册业务,而把注册单独作为一个类。这样可以保证每个类的职责单一化,两个功能不会耦合在一起。从而降低耦合度,耦合度降低了,就有了这样的好处:当你换掉DBHelper时,注册业务不会被影响。这就是面向对象的可维护性,程序中和各个模块之间相互独立,耦合度不高,其中每一个模块的职责都很单一,这样的程序,维护起来就会很容易,不会牵一发而动全身。当然,并不是耦合度越低越好,耦合太低,会造成模块之间的脱节,所以还是要有耦合的,做到高内聚,低耦合即可。

当我们想为我们的程序添加新功能时,当然都是希望不改代码或者少改代码,而是通过添加代码就可以实现的。这其实并不难,只要你遵守开闭原则就行了。那么,开闭原则是什么呢。开闭原则就是对拓展开放,对修改封闭。意思就是,一个程序应该可以能够去拓展,

但不能或尽量少去修改。我们举个例子,现在我们刚刚做好了一个程序,而需求变了,要求我们改用Oracle而不用SqlServer。这时,我们就不得不大量改动代码,到那时你就会知道啥是痛苦了,如果在设计时,我们遵守了开闭原则,就会很轻松了。我们当初在编码时,应该创建一个DBHelper的接口,然后在创建SqlDBHelper并继承于DBHelper,所有的业务都通过DBHelper去调其子类的方法,这样再换数据库时,只需添加一个OraDBHelper即可,完全做到了对拓展开放,对修改封闭。由此我们可以看出,提早创建抽象就会有效的避免此类问题,开闭原则会留下那个接口,这就是对拓展开放。只要我们遵守了开闭原则,程序的拓展性就会很好。

我们再举个例子,我们现在想做一个注册,发现以前写过一个注册类,就像复用它,可真正用时才发现那个注册类里是直接是直接调用SqlDBHelper的,可我们现在用的是Oracle,这就导致我们写的这个注册类不可复用。这是因为注册类这个高层模块直接依赖于SqlDBelper这个低层模块。想避免这样的问题,还是要创建抽象,让注册类通过DBHelper这个接口来间接调用SQlDBHelper的方法,这样,注册类就不会依赖于SqlDBHelper,也就可以实现复用代码了。这就是依赖倒置原则:抽象不应依赖于细节,细节应依赖于抽象。在这里就是注册类不应依赖于SqlDBHelepr,而是依赖于DBHlepr。大家现在应该明白抽象的用处了吧,但是也不要去刻意的去抽象每个类,只需要把经常会发生变化的类抽象即可。

在我看来,面向过程的设计是在设计时分出步骤,一步一步的先

干什么,在干什么。它的重点应该在于实现功能时该怎样设计方法、步骤。而面向对象设计是需要什么样的功能就创建什么样的抽象,通过抽象实例化出完成功能的对象,再通过具体的对象来完成功能。它的重点在于怎样设计抽象,从而产生相应的对象,赋予对象某些行为,在组织对象去完成功能。所以面向过程设计出的软件就像一条麻绳。由一根根的线从头贯穿到尾,相互交错而成。一旦成型,就不能灵活的变长,变粗。而面向对象设计出的软件就像一条铁链,由一个个铁环首尾相接而成,想改变长度增减铁环即可,而且铁链断了,再拿一个新铁环就可以连上。

说了这么多,相信大家对面对象会有一个重新的认识吧,会觉得面向对象的好处已经不言而喻,但我不那么认为,我觉得这只是面向对象的冰山一角,只有在实践中,大家才会切实体会到它的妙处。

相关推荐