面向对象C++基础(书中的“你懂得C,所以C++不在话下”)

来源:互联网 发布:北京工商大学网络 编辑:程序博客网 时间:2024/06/04 23:22

  面向对象编程的特点是继承和动态绑定,C++通过类的派生支持继承,通过虚拟函数支持动态绑定,虚拟函数提供了一种封装类体系实现细节的方法。
11-2  抽象实例 (abstracion)
 

汽车实例

对象特征

软件实例:排序程序

Car“

整个事物具有一个名字

sort“

输入:燃料和汽油

定义良好的输入和输出

输入:一个未排序的文件

输出:一个已排序的文件

发动机,传感器,泵等

由更小的自包含的对象组成

模块,头文件,函数,数据结构

世界上存在很多汽车,有许多不同的品种

可有很多的实例对象

它的实现应该允许几个用户同时排序,例如不需要依赖一个全局的临时工作空间

燃料并不依赖并影响挡车板清洗器

更小的自包含的对象无相互作用,除非它是通过定义良好的接口进行

用于读取记录的程序应该与关键的比较程序独立

计时器的计时变化并不是驾车者的任务,所以驾驶员不能直接控制计时器对其进行修改

不能直接操纵或甚至看到实现细节

用记应该并不需要知道或进一步利用程序所使用的特定的排序算法(如快速排序,堆排序,Shell排序等)

可以更换一个更好的发动机,而无须更改驾驶员的操作方法

可以不修改用户听情况下修改实现

实现者应该能够在不影响用户使用的前提下替换一种更好的排序算法


抽象是非常有用的,因为它允许程序实现下列目标:

1)隐藏不相关的细节,把注意力集中到本质上。

2)向外部世界提供一个”黑盒子“接口。接口确定了施加在对象之上的有效操作的集合,但它并不提示对象在内部是怎样实现它们的。

3)把一个复杂的系统分解成几个相互独立的组成部分。这可以做到分工明确,避免组件之间不符合规则的相互作用。

4)重用和共享代码。

C++中类通常的形式是:

class类名{

访问控制:声明

访问控制:声明

}

访问控制有:public,protected,private,friend,virtual.

声明:就是正常的C声明,内容包括函数,类型(包括其他类)或数据,类把它们捆在一起。


当成员函数在类的外部实现时,前面必须附加一些特别的前缀。这个前缀就是::,它仿佛在大声呐喊”嗨!我很重要!我表示有些东西属于一个类“.

返回值 类名::函数名(参数列表){/* 实现 */}

classFruit{

public:void peel();

slice();

juice();

Fruit(intI,int j);//构造函数

~Fruit();//析构函数


private:intweight,calories_per_oz;


};

voidFruit :: peel(){ printf(“in peel”);}//成员函数在类的外部实现

Fruit::Fruit(intI,int j){weight = I;calories_per_oz = j; } //构造函数体

Fruitmelon(4,5),banana(12,8);//对象声明时同构造函数初始化


关键概念:继承(inheritance

从一个类派生另外一个类,使前者所有的特征在后者中自动可用。它可以声明一些类型,这些类型可以共享部分或全部以前所声明的类型。它也可以从超过一个的基类型共享一些特征。

classApple :public Fruit

不要把一个类内部嵌套另一个类与继承混淆。嵌套通常被用于实现容器类(就是实现一些数据结构的类,如链表、散列表、队形等),现在C++增加了模板(template)这个特性,它也被用于实现容器类。


重载(overload)──作用于不同类型的同一种操作具有相同的名字

overload就是简单地复用一个现存的名字,但使它操作一个不同的类型。它可以是函数的名字,也可以是一个操作符。<<>>操作符在C语言中也用作左移位和右移边操作符,但它用重载于C++I/O。重载允许程序员复用函数名和绝在多数的操作符如+=*-[]和()等,赋予它们新的含义,以便用于用户定义类型。这也是OOP设计哲学中把所有对象作为一个组合整体的思想。


多态(polymorphism)──运行时绑定/

当使用继承时就要用到这种机制:在时我无法在编译时分辨所拥有的对象到底是基类对象还是派生类对象。这个判断并调用正确的函数的过程被称为”动态绑定(latebinding)”。在成员函数前面加上virtual关键字告诉编译器该成员函数是多态的(也就是虚拟函数)。运行时系统在几个名字相同的函数中选择正确的一个进行调用,这就是多态。


异常(exception:C++的这个概念源于Ada,也源于CluMIT所开发的一种实验性的语言,它的关键思想是”cluster”,集群)。它用于错误处理时改变程序的控制流。异常通过发生错误时把处理自动切换到程序中用于处理错误的那部分代码。从而简化错误处理。


模板(template):这个特性支持参数化类型。同类/对象的关系一样,模板/函数的关系也可以看作是为算法提供一种”甜点刀具”的方法。一旦确定了基本的算法,你可以把它应用于不同的类型。它的语义比较复杂:template<classT> T min(T a,T b){return (a < b) ? a : b;}

允许你对min函数和变量a,b赋予任意的类型T(该类型必须能接受<操作符)。


内联(inline)函数:程序员可以规定某个特定的函数在行内以指令流的形式展开(就像宏一样),而不是产生一个函数调用。


newdelete操作符,用于取代malloc()free()函数。这两个操作符用起来更方便一些(如能够自动完成sizeof的计算工作,并会自动调用合适的构造函数和析构函数)。new能够真正地建立一个对象,则malloc()函数只是分配内存。


传引用调用(call-by-reference,相当于传址调用)c语言只使用传值调用(call-by-value)。C++在语言中引入了传引用调用,可以把对象的引用作为参数传递。


C++中存在,但在C语言中却不存在的限制有:

1)在C++中,用户代码不能调用main()函数,但在C语言中却是允许的(不过这种情况极为罕见)。

2)完整的函数原型声明在C++中是必须的,但在C语言中却没有这么严格。

3)在C++中,由typedef定义的名字不能与已有的结构标签冲突,但在C语言中却是允许的(它们分属于不同的名字空间)。

4)当void*指针赋值给另一个类型的指针时,C++规定必须进行强制类型转换,但在C语言中却无必要。

C++C语言中含义不一样的特性:

1C++至少增加了十几个关键字,这些关键字在C语言中可以作为标识符使用,但如果这样做了,用C++编译器编译这些代码时就会产生错误信息。

2)在C++中,声明可以出现在语句可以出现的任何地方。在C语言中的代码块中,所有的声明必须出现在所有语句的前面。

3)在C++中,一个内层范围的结构名将会隐藏外层空间中相同的对象名。在C语言中则非如此。

4)在C++中,字符常量的类型是char,但在C语言中,它们的类型是int。也就是说,以C++中,sizeof('a')的结果是1,而在C语言中,它的值要大一些。

5)由于C++新的//注释符,有时会在两种语言中产生微妙而怪异的差别。(参见书中第二章)


选择一个本优秀的C++书籍(浏览数册,选择一本在风格上你最喜欢的),注意它必须把握住这门语言的脉搏(C++仍在发展之中),它必须涵盖异常和模板。


编程语言的主要目标是提供一个框架,用计算机能够处理的方式表达问题的解决方法。编程语言越是能够体现这个原则,就越成功。一门语言,如果它的结构是有用的“建构块”,便于堆积起来解决某个特定领域的问题,它就能获得成功。

原创粉丝点击