面向对象相关

来源:互联网 发布:系统集成软件开发 编辑:程序博客网 时间:2024/05/17 23:05

面向对象相关

面向对象与面向过程的区别:

1)出发点不同。面向对象是用符合常规思维方式来处理客观世界的问题,强调把问题域的要领直接映射到对象及对象之间的接口上。而面向过程则不然,它强调的是把过程抽象化与模块化,它是以过程为中心构造或处理客观世界问题的。

2)层次逻辑关系不同。面向对象方法则是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位,尽可能地使计算机世界向客观世界靠拢,以使问题的处理更清晰直接。面向对象的方法是用类的层次结构来体现类之间的继承和发展。而面向过程方法处理问题的基本单位是能清晰准确地表达过程的模块,用模块的层次结构概括模块或模块间的关系与功能,把客观世界的问题抽象成计算机可以处理的过程。

3)数据处理方式和控制程序方式不同。面向对象方法将数据与对应的代码封装成一个整体,原则上其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成。控制程序方式上是通过“事件驱动”来激活和运行程序。而面向过程方法是直接通过程序来处理数据,处理完毕后即可显示处理结果。在控制程序方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制、调用与被调用的关系。

4)分析设计与编码转换方式不同。面向对象方法贯穿软件生命周期的分析、设计及编码之间,是一种平滑的过程,从分析到设计再到编码采用一致性的模型表示,即实现的是一种无缝连接。而面向过程方法强调分析、设计及编码之间按规则进行转换,贯穿软件生命周期的分析、设计与编码之间,实现的是一种有缝的连接。

 

面向对象的基本特征

1)封装。封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。C++中类是一种封装手段,采用类来描述客观事物的过程就是封装,本质上是对客观事物的抽象。

2)继承。继承可以使用类的所有功能,而不需要重新编写原来的类,它的目的是为了进行代码复用和支持多态。它一般由3种形式:实现继承、可视继承、接口继承。其中,实现继承是指使用基类的属性和方法而无需额外编码的能力;可视继承是指子窗体使用父窗体的外观和实现代码;接口继承仅使用属性和方法,实现滞后到子类实现。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。通过继承创建的新类称为“派生类”或“子类”,被继承的类称为“父类”“基类”或“超类”,而继承的过程就是从一般到特殊(具体)的过程。

3)多态。多态是指同一个实体同时具有多种形式,它主要体现在类的继承体系中,它是将父对象设置成为和一个或更多的它的子对象相等的技术,赋值以后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单地说,就是允许将子类类型的指针赋值给父类类型的指针。编译时多态是静态多态,在编译时就可以对象的使用形式。

 

深拷贝&浅拷贝

如果一个类拥有资源(堆或者其他系统资源),当这个类的对象发生复制过程中,资源重新分配,这个过程就是深拷贝;反之对象存在资源,但复制过程并未复制资源的情况下视为浅拷贝。

 

友元函数需注意问题:

1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括private和public部分。

2)友元函数不是类的成员函数,所以友元函数实现跟普通函数一样,在实现是不用“::”指示属于哪个类,只有成员函数才可以使用“::”作用域符号。

3)友元函数不能直接访问类的成员,只能访问对象成员。

4)友元函数可以访问对象的私有成员,但普通函数不行。

5)调用友元函数时,在实际参数中需要指出访问的对象。

6)类与类之间的友元关系不能继承。

注意:友元函数不是成员函数,但是它可以访问类中的私有成员。友元的作用是提高程序的运行效率,但是它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

 

复制构造函数的特点:

1)该函数名与类同名,因为它也是一种构造函数,并且该函数不指定返回类型。

2)该函数只有一个参数,并且是对某个对象的引用。

3)每个类都必须有一个复制构造函数。

4)如果程序员没有哦显式地定义一个复制构造函数,那么,C++编译器会自动生成一个缺省的赋值构造函数。

5)复制构造函数的目的是建立一个新的对象实体,所以一定要保证新创建的对象有独立的内存空间,而不是与先前的对象共用。

 

复制构造函数与赋值运算符的区别:

1)赋值构造函数生成新的类对象,而赋值运算符不能。

2)由于复制构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否与新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配,要先把内存释放掉。

3)当类中有指针类型的成员变量时,一定要重写复制构造函数和赋值构造函数,不能使用默认的。

 

类的成员变量的初始化顺序

1)基类的静态变量或者全局变量;

2)派生类的静态变量或者全局变量;

3)基类的成员变量;

4)派生类的成员变量;

 

C++中的空类默认产生的成员函数

默认构造函数、复制构造函数、析构函数、赋值运算符重载函数、取址运算符重载函数、const取址运算符重载函数等

 

C++初始化列表:

1)当类中含有const(常量)、reference(引用)成员变量时,只能初始化,不能对它们进行赋值。常量不能被赋值,只能被初始化,所以必须在初始化列表中完成,C++的引用也一定要初始化,所以必须在初始化列表中完成。

2)基类的构造函数都需要初始化列表。构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化。

3)成员类型是没有默认构造函数的类。若没有提供显式初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。