C++面向对象程序设计总结.docx
《C++面向对象程序设计总结.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计总结.docx(8页珍藏版)》请在冰豆网上搜索。
C++面向对象程序设计总结
第一章面向对象编程原理
●近五十年间,软件技术经历了多个阶段的发展演变
●目前为止最流行的技术还是面向过程编程(POP)
●面向过程编程采用了自顶向下的设计方案,问题被看做多个执行任务的序列。
为完成这些任务,须实现一些函数。
●面向过程有两大不足,即:
(1)数据可在程序内自由迁移,程序内任何函数都会引起数据的更改,增加了数据的脆弱性。
(2)它并不能很好地建模现实世界。
●为了克服面向过程编程中的不足,人们发明了面向对象编程(OOP)。
它采用自底向上的编程方案,在程序开发中,把数据视为重要元素,不允许数据在系统内自由迁移。
它还将数据和函数紧密绑定于成为类的数据结构中,函数可操作类中的数据。
此特性称为数据封装。
●在面向对象编程中,问题被视为一系列称为对象的实体的集合。
对象是类的实例;
●将数据与程序的直接访问隔绝,这称为数据隐藏。
●数据抽象指的是,将各种必要特性合并,而不引入背景细节。
●继承是这样的一个过程,即某类的对象得到另一类对象的属性。
●多态指的是,一个名称,多种形态。
在程序中,我们可以借此定义多个同名函数。
此特性亦可重载运算符,这样一来,同一个运算符在不同的实例下,会有不同的行为。
●动态绑定指的是,给定过程的代码,直到运行期被调用时才确定。
●消息传递涉及对象名,函数(消息)名以及发送的信息。
●与传统的编程技术相比,面向对象技术具有诸多优势——最显著的当属重用技术。
●在实时系统等几乎所有的计算机领域,面向对象编程的应用程序都已受到重视。
●不少语言都支持面向对象编程,流行的语言包括C++、Smalltalk和Java。
第二章C++入门
●C++是C语言的超级
●C++在C语言的基础上,添加了一些面向对象的特性,诸如对象、继承、函数重载和运算符重载。
这些特性加强了程序的清晰性,可扩展性,使程序容易维护。
●C++可用于开发各种系统,诸如编辑器、编译器、数据库、通信系统以及其他更多复杂的实际系统。
●C++支持交互式输入输出,并引入了新的注释符号//,可用于注释单句。
它也支持C语言的注释风格。
●和C程序一样,所有C++程序的执行入口都是main()函数,并以return()语句作为结束。
头文件iostream应包含于所有使用输入输出操作的程序开头。
●所有标准C++程序都要包含usingnamespacestd指令
●典型的C++程序包括四个基本部分:
也就是头文件包含部分、类声明部分、成员函数部分和主程序部分
●和C程序一样,C++程序可用于任何文本编辑器创建
●大多数编译器提供了集成开发运行环境。
流行的编译器系统有UNIXAT&TC++、TurboC++和微软公司的VisualC++
第三章符号、表达式和控制结构
●C++有不同的符号,包括关键字、标识符、常量、字符串和操作符
●标识符指的是变量名、函数名、数组名、类名等
●C++中增加了void的一个用途,可用于声明通用指针
●C++中枚举数据类型略有不同,枚举类型名称为新的类型名。
这样我们就可以声明枚举类型的变量
●在C++中,字符数组的大小应比字符串的实际长度大1
●C++增加了指针常量和常量指针的概念,对于前者我们不能修改赋予它的地址值,对于后者,我们不能修改它指向的内容。
●在C++的内存管理和多态实现中,指针被广泛地使用。
●C++中提供了const修饰符,用于声明常量,常量也是变量,只是其值不可变更。
const修饰符默认修饰整型。
●C++的变量类型检查非常严格,它不允许不同类型变量之间的赋值。
类型转换是打破此规的唯一办法。
●C++允许我们在程序中随处声明变量,而且可以利用声明处的表达式,在运行期完成初始化。
●引用变量给之前定义的变量提供了一个别名。
它们都指向内存中的同一个数据对象。
所以,改变其中一个的值,另一边量的值也会随之改变。
●引用变量必须在声明时初始化,这建立了它和要引用的变量之间的对应关系。
●作用于解析操作符(:
:
)的主要用于类,以识别成员函数所属的类
●除了malloc()、calloc()、free()函数外,C++提供了两个一元操作符,即new和delete,以更好和更方便地分配和释放内存
●C++也提供了操纵器,来格式化输出数据。
最常用的操纵器为endl和setw
●C++支持七种表达式类型。
表达式中数据类型混用时,C++使用特定规则,自动地进行类型转换。
●使用类型转换操作符,C++也可显示地进行变量和表达式的类型转换
●和C语言一样,C++也支持三种基本的控制结构,也就是顺序结构,分支结构和循环结构,并使用各种控制语句实现它们,比如if、if…else、switch、do…while、while以及for。
第四章C++中的函数
●在程序的不同处,调用函数可减少程序的大小。
●在C++中,main()函数向操作系统返回一个整型值。
因为函数的返回值类型默认是整型,所以main()函数中的关键字int是可选的。
而如果没有返回语句,大部分C++编译器会提示一个警告。
●函数原型向编译器提供了函数的细节,比如参数的数目和类型,以及返回值的类型。
●C++的引用变量使我们可以传引用参数给函数。
函数也可以返回引用变量。
●当函数声明为内联时,编译器用相应的函数代码替换了函数调用。
一般情况下,小函数才使用内联。
●编译器可能会忽略函数的内联声明,如果函数声明太长或过于复杂,编译器将按常规函数编译它。
●当函数声明时,C++允许我们把默认值赋给函数参数。
这种情况下,我们可以无需指明所有参数,便可调用函数。
默认参数总是由右到左添加。
●C++中,函数的参数可声明为常量,表示函数不可更改此变量。
●C++允许函数重载,也就是说,我们可以定义多个同名函数。
通过检查参数数目和类型编译器会准确地匹配函数调用和函数代码。
●C++支持两种新的函数类型,亦即友元函数和虚函数。
●C++标准库支持很多数学库函数,使用它们可以完成许多数学计算。
第五章类和对象
●类是结构体数据类型的扩展,一个类有多个成员变量和成员函数。
●默认情况下,类的成员是私有的,而结构体的成员是公用的。
●只有成员函数可以访问私有数据成员和私有函数。
但是类外可以访问公用成员。
●在C++中,类变量称为对象。
利用对象并使用点操作符,我们可以访问类的公用成员。
●我们可以在类内或类外定义成员函数。
成员函数和常规函数的区别在于,成员函数的头部有一个隶属标识符,以表明所属类。
●对象声明时,内存空间才会分配。
每一对象的成员变量空间单独分配,而成员函数的空间则统一分配。
●类的一个成员变量可声明为静态成员,一般用于维护整个类的通用值。
●静态成员变量必须定义于类外。
●静态成员函数可访问声明在同类的静态成员,调用静态成员函数时需要用到类名。
●C++允许我们使用对象数组。
●对象可用作函数自变量。
●友元函数不在友元声明类的作用域类,它可以访问累的所有私有数据。
●函数可以返回对象。
●如果成员函数不改变类内的任何数据,我们可以将其声明为常量成员函数,只要在函数原型中加上关键词const(声明和定义都要加)。
●我们也可以在函数内定义和使用类。
这种类称为局部类。
第六章构造函数和析构函数
●C++提供了一种称为构造函数的特殊成员函数,它能帮助对象在创建时完成初始化。
这一过程被称为对象的自动初始化。
●构造函数名和类名一致。
●构造函数通常用来初始化变量,以及分配内存。
●和常规函数一样,构造函数也可以被重载。
●当对象同时被创建和初始化时,复制构造函数被调用。
●我们可以声明一个常量对象,其数据值不能改变。
●C++还提供另一种成员函数,称为析构函数。
当对象不再需要时,会调用这种函数来销毁对象。
第七章运算符重载和类型转换
●运算符重载是C++的重要特性之一。
又被称为编译时多态性。
●使用重载特性,我们可以对两个用户自定义数据类型,比如说对象,执行相加的操作,使用的语法就和基本数据类型一样。
●我们可以重载几乎所有C++的运算符,下面几个是例外:
✧类成员访问符(.,.*)。
✧作用域解析符(:
:
)。
✧大小运算符(sizeof)。
✧条件运算符(?
:
)。
●运算符重载是通过一种称为运算符函数的特殊函数完成的,该函数定义了运算符的特定任务。
●运算符重载时有一些限制。
运算符函数必须是非静态的成员函数或者友元函数。
重载的运算符必须有至少一个用户自定义类型的操作数。
●编译器不支持用户自定义数据类型的自动类型转换,我们可以使用自定义的转换运算符函数,以实现自定义数据类型的自动类型转换。
●转换运算符函数应符合下列条件:
✧必须是类成员。
✧必须不指定返回值。
✧必须没有参数。
第八章继承:
类的扩展
●从旧类派生一个新类的机制被称为继承。
继承提供了可重用性的概念。
通过继承,C++的类可以被重用。
●派生类继承了基类的一部分或所有特性。
●只有一个基类的派生类被称为单继承。
●可从多个类继承,这被称为多继承。
●可从另一派生类继承类,这被称为多级继承。
●当某类的属性被多于一个类继承时,这被称为层次继承。
●不管是在公用模式还是私有模式,类的私有成员都不可被继承。
●以公用模式继承的保护成员仍为派生类的保护成员,而以私有模式继承的保护成员,则变成派生类的私有成员。
●友元函数和友元类的成员函数可直接访问私有和保护数据。
●派生类的成员函数只能直接访问保护和公用数据。
不过他们可通过基类的成员函数访问私有数据。
●多路继承可能引起祖父基类的继承成员的重复。
通过将共同的基类设为虚基类,我们可以避免祖父基类成员的重复。
●在多继承中,基类的创建次序与他们在派生类中的声明次序一致。
●类可包含其他类的对象。
这被称为包含关系或嵌套。
第16章标准C++的新特性
●在原有的C++语言规范基础上,标准C++委员会又添加了很多新特性。
●两个新的数据类型bool和wchar_t的添加,为C++增加了可用的数据类型
●bool类型可存布尔值,即true和false
●从字面上理解wchar_t类型可以存储一个十六位的字符
●引入了四种新的转换操作符吗,即static_cast、const_cast、reinterpret_cast和dynamic_cast
●static_cast操作符用于任何标准的数据类型转换
●const_cast操作符可能用于显示地更改对象的const和volatile属性
●使用reinterpret_cast操作符,我们可以把对象的数据类型转换成不同类型
●运行期对象的转换可由dynamic_cast操作符完成
●另一个新的操作符是typeid,他可以在运行期提供对象的信息
●构造函数可声明为mutable,我们可以使一组常量对象项或函数可变。
●标准C++允许我们在自己的程序中,定义自己的名称空间域,以克服特定的名称空间冲突的问题
●名称空间可嵌套
●使用using声明或using指令,可以访问名称空间中的成员
●对于某些操作符,标准C++提出了可以取而代之的操作符关键词
●在标准C++中,头文件都没有.h后缀,并且须在每个程序中使用using指令:
usingnamespacestd;
●有些旧风格的头文件在新的C++标准中被重新命名。
比如math.h文件更名为cmath
第十七章面向对象系统的开发
为了高效地打造高质量的软件,软件工程师已经动用了各种工具、方法和过程,以控制软件开发的流程。
方法提供了构建软件的思路,而工具则为这些方法提供了自动的或半自动的支持。
他们用于软件开发过程的各个阶段,即策划、分析、设计、开发和维护。
软件开发过程把方法和工具整合在了一起,使得软件系统的开发合理而又能及时完成。
软件开发过程还提供了使用方法和工具的指导,如何在每一阶段开发交付的产品,应用何种控制管理,以及使用什么样的里程标以评估项目的进展。
已经有一些软件开发的方案,每一个都使用不同的方法和工具。
特定方案的选用取决于应用的性质,使用的编程语言,以及所需的控制和交付产品。
一个成功系统的开发不仅只依赖于合适的方法和技术,也依赖于开发者迎着系统目标的努力。
成功的系统必须具备:
1.满足用户需求
2.易于被用户和操作员理解
3.易用
4.易于修改
5.可扩展
6.对于数据误用,有足够的安全机制
7.能令人满意地处理错误和异常
8.在预算内按计划交付
在本章中,我们将探讨一些软件开发中广泛使用的传统方案,然后再讨论一些目前的思想,这些思想可用于面向对象的软件开发。
●对于面向过程的开发,最广泛的经典的系统开发生命周期可由下面步骤组成:
◆问题定义
◆分析
◆设计
◆编码
◆测试
◆维护
●在面向对象方法中,系统可视为实体的集合,它们相互作用,以达到特定的目的
●在面向对象分析中,实体被称为对象。
面向对象分析(OOA)这种方法指的是,根据现实世界的对象,行为和相互作用,来确认软件的需求
●面向对象设计(OOD)将软件需求转换为对象规范,并派生出类的层次,对象即从该层次创建
●面向对象编程(OOP)指的是,借助于面向对象编程语言比如C++,使用对象实现程序
●面向对象分析(OOA)方案由下列步骤组成
●
第14章标准模板库介绍
●一组泛型类和函数的集合被称为标准模板类(STL)。
STL已成为C++标准库的一部分
●STL由三个主要部分组成:
容器、算法和迭代器。
●容器是能存放同类数据的对象,它们可分为三大类:
线性容器、关联式容器和衍生容器
●容器类定义了大量函数,可用来操作其中的数据
●算法是一些独立的函数,可用来对容器的数据执行操作,比如排序、搜索和合并等。
●迭代器就像指针一样,它们可用以访问容器的元素,从而在算法和容器间搭建了桥梁。
可以为特定的容器定义迭代器,它也用作算法的参数。
●某些算法使用函数对象来进行操作函数对象由某类创建,该类只包含重载的()操作符函数。
第13章异常处理
●异常是程序运行时可能遇到的特殊问题。
●异常有两种:
同步异常和异步异常。
C++提供的机制只处理同步异常。
●异常通常由try块中的错误语句引发。
语句发现错误并将其抛出,然后被catch语句捕捉到。
●catch语句定义了成块的语句,以适当地处理异常。
●当异常没有被捕捉到时,程序将退出。
●try块可能会直接抛出异常,或者调用了抛异常的函数。
不管抛出点在哪里,catch块都直接放置在try块后。
●我们可以放置多个catch块,以捕捉和处理try块抛出的多种类型的异常。
●有可能让某个catch语句捕捉到所有异常,只要将其参数变成省略号即可。
●我们也可以限定函数只抛出某些指定的异常,只要在函数定义后添加特定抛出语句即可。