C++面向对象程序设计总结

第一部分 面向对象编程原理

? 近五十年间,软件技术经历了多个阶段的发展演变

? 面向过程编程采用了自顶向下的设计方案,问题被看做多个执行任务的序列。为完成这

些任务,须实现一些函数。

? 面向过程有两大不足,即:(1)数据可在程序内自由迁移,程序内任何函数都会引起数

据的更改,增加了数据的脆弱性。(2)它并不能很好地建模现实世界。

? 为了克服面向过程编程中的不足,人们发明了面向对象编程(OOP)。它采用自底向上

的编程方案,在程序开发中,把数据视为重要元素,不允许数据在系统内自由迁移。它还将数据和函数紧密绑定于成为类的数据结构中,函数可操作类中的数据。此特性称为数据封装。

? 在面向对象编程中,问题被视为一系列称为对象的实体的集合。对象是类的实例; ? 将数据与程序的直接访问隔绝,这称为数据隐藏。

? 数据抽象指的是,将各种必要特性合并,而不引入背景细节。

? 继承是这样的一个过程,即某类的对象得到另一类对象的属性。

? 多态指的是,一个名称,多种形态。在程序中,我们可以借此定义多个同名函数。此特

性亦可重载运算符,这样一来,同一个运算符在不同的实例下,会有不同的行为。 ? 动态绑定指的是,给定过程的代码,直到运行期被调用时才确定。

? 消息传递涉及对象名,函数(消息)名以及发送的信息。

? 与传统的编程技术相比,面向对象技术具有诸多优势——最显著的当属重用技术。 ? 在实时系统等几乎所有的计算机领域,面向对象编程的应用程序都已受到重视。 ? 不少语言都支持面向对象编程,流行的语言包括C++、Smalltalk和Java。

第二部分C++入门

? C++是C语言的超级

? C++在C语言的基础上,添加了一些面向对象的特性,诸如对象、继承、函数重载和运

算符重载。这些特性加强了程序的清晰性,可扩展性,使程序容易维护。

? C++可用于开发各种系统,诸如编辑器、编译器、数据库、通信系统以及其他更多复杂

的实际系统。

? C++支持交互式输入输出,并引入了新的注释符号//,可用于注释单句。它也支持C语

言的注释风格。

? 和C程序一样,所有C++程序的执行入口都是main()函数,并以return()语句作为

结束。头文件iostream应包含于所有使用输入输出操作的程序开头。

? 所有标准C++程序都要包含using namespace std指令

? 典型的C++程序包括四个基本部分:也就是头文件包含部分、类声明部分、成员函数部

分和主程序部分

? 和C程序一样,C++程序可用于任何文本编辑器创建

? 大多数编译器提供了集成开发运行环境。流行的编译器系统有UNIX AT&T C++、Turbo C++

和微软公司的Visual C++

第三部分 符号、表达式和控制结构

? 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++

的类可以被重用。

? 派生类继承了基类的一部分或所有特性。

? 只有一个基类的派生类被称为单继承。

? 可从多个类继承,这被称为多继承。

? 可从另一派生类继承类,这被称为多级继承。

? 当某类的属性被多于一个类继承时,这被称为层次继承。

? 不管是在公用模式还是私有模式,类的私有成员都不可被继承。

? 以公用模式继承的保护成员仍为派生类的保护成员,而以私有模式继承的保护成员,则

变成派生类的私有成员。

? 友元函数和友元类的成员函数可直接访问私有和保护数据。

? 派生类的成员函数只能直接访问保护和公用数据。不过他们可通过基类的成员函数访问

私有数据。

? 多路继承可能引起祖父基类的继承成员的重复。通过将共同的基类设为虚基类,我们可

以避免祖父基类成员的重复。

? 在多继承中,基类的创建次序与他们在派生类中的声明次序一致。

? 类可包含其他类的对象。这被称为包含关系或嵌套。

第九部分 异常处理

? 异常是程序运行时可能遇到的特殊问题。

? 异常有两种:同步异常和异步异常。C++提供的机制只处理同步异常。

? 异常通常由try块中的错误语句引发。语句发现错误并将其抛出,然后被catch语句捕

捉到。

? catch语句定义了成块的语句,以适当地处理异常。

? 当异常没有被捕捉到时,程序将退出。

? try块可能会直接抛出异常,或者调用了抛异常的函数。不管抛出点在哪里,catch块都

直接放置在try块后。

? 我们可以放置多个catch块,以捕捉和处理try块抛出的多种类型的异常。

? 有可能让某个catch语句捕捉到所有异常,只要将其参数变成省略号即可。

? 我们也可以限定函数只抛出某些指定的异常,只要在函数定义后添加特定抛出语句即

可。

第十部分 面向对象系统的开发

为了高效地打造高质量的软件,软件工程师已经动用了各种工具、方法和过程,以控制软件开发的流程。方法提供了构建软件的思路,而工具则为这些方法提供了自动的或半自动的支持。他们用于软件开发过程的各个阶段,即策划、分析、设计、开发和维护。软件开发过程把方法和工具整合在了一起,使得软件系统的开发合理而又能及时完成。软件开发过程还提供了使用方法和工具的指导,如何在每一阶段开发交付的产品,应用何种控制管理,以及使用什么样的里程标以评估项目的进展。

已经有一些软件开发的方案,每一个都使用不同的方法和工具。特定方案的选用取决于应用的性质,使用的编程语言,以及所需的控制和交付产品。一个成功系统的开发不仅只依赖于合适的方法和技术,也依赖于开发者迎着系统目标的努力。成功的系统必须具备:

1. 满足用户需求

2. 易于被用户和操作员理解

3. 易用

4. 易于修改

5. 可扩展

6. 对于数据误用,有足够的安全机制

7. 能令人满意地处理错误和异常

8. 在预算内按计划交付

 

第二篇:c++面向对象程序设计期末复习总结

题型

判断---10/10

选择----30/15

简答----20/5

程序理解---20

程序设计—20


1. 虚析构函数的作用

析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。

只要基类声明了虚析构函数,则它所有的派生类均不用再将析构函数声明为虚的

(拓展:   虚析构函数例如:Virtual^Point (){};

构造函数不能声明为虚函数,因为在执行构造函数时对象还未完成建立过程,当然谈不上把函数与对象的绑定

如果基类的析构函数为虚析构函数时,无论指针指向基类的指针同意了族中的哪一个对象。系统都采用动态关联,调用相应的析构函数,对对象进行清理

如果基类的析构函数为虚析构函数,派生类的析构函数自动转化为虚析构函数(即使派生类与基类析构函数的名字不同)

2. 拷贝函数在哪几种情况下  P103

复制构造函数在用已有对象复制一个新对象时调用

(1)       程序中需要建立一个对象,并用另一个同类的对象对它初始化

(2)       当函数的参数为类的对象时。调用函数时需要将实参对象完整的传递给形参,也就需要建立一个实参的拷贝。这就是实参复制一个形参,系统是通过调用复制构造函数来实现的,这样才能保证形参具有和形参相同的值。

(3)       函数的返回值是类的对象时,在函数调用完毕将返回值带回函数调用处时。此时需要将函数中的一个对象复制一个临时对象并传给该函数的调用处

(拓展:

       Box(const Box &b)

       {

              c=b.c;

              o=b.0;

       }

3. 函数重载与覆盖的异同,他们与多态的关系是

函数重载: 是在同一个类中,相同名称不同形式参数的若干个函数,因此只要参数不同就可以调用这些同名称而不同内容的函数。

覆盖(也叫重写): 是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

(拓展:虚函数是父类与子类中名称相同且参数相同的函数,因此在定义对象时,如果对象是是父类的对象执行的是父类的虚函数,如果对象是子类的对象执行的是子类虚函数。)

4. Const用途(至少两种,常变量、常函数)

const关键字至少有下列n个作用:

(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;

(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例

(拓展:

Time t1(10,,2,36),t2;

Time *const p;

p=&t1;

p=&t2;  //非法

常指针:指向对象的常指针变量的值不能改变,即始终指向一个对象,但可以改变其指向的对象(eg:t1),常指针常用来作函数的形式参数,,防止函数在执行过程中改变指针变量的值

拓展看p94页

常成员函数不能调用另一个非const成员函数

常成员函数:只能引用本类中的数据成员函数。而不能修改

Eg:void get_time() const;      //声明 ,调用时候不必价const

定义对象时加const 常对象

const Time  t1(10,15,36)  //定义常对象t1,防止普通成员函数修改数据成员的值或者//Time const t1(10,15,36)

则t1.get_time();  //非法

虽然get_time()函数并未修改常对象中数据成员的值,也不可以

怎样才能常对象的数据成员则:  void get_time() const;  //将函数声明为常函数

常函数允许访问常对象中的数据成员,但是不允许修改

也即不能调用常对象中的普通成员函数,以及常成员函数不能修改常对象的成员数据,保证了常对象中数据成员的值绝对不会变

5. 成员函数,全局函数,友元函数的区别

成员函数:类中声明的函数

全局函数:全局函数是定义在主函数和任何类定义之外的函数,这种函数在整个程序的任何地方都允许被调用。

友元函数:本类以外的其他地方定义的函数,在类体用friend声明。他可以访问本类的私有成员

6. 类与对象的区别

类是抽象的,是属性与函数的封装

对象是类的具体的一个实例

7. 数据对象的引用是什么,对象引用与对象指针区别是什么

引用是为数据对象定义别名。引用与指针有以下几点区别: (1)引用名不是内存变量也不会开辟新的内存单元,而指针变量要开辟内存空间。  (2)引用名需要在变量定义与变量名绑定,并且不能重定义;指针变量可以在程序中赋给不同的地址值,改变指向。  (3)程序中用变量名和引用名访问对象的形式和效果一样;指针变量通过间址访问对象。

8. C++继承是如何工作的

在已有类的基础上继承属性与函数,并且添加新的属性与函数

9. 面向对象程序设计有哪4种主要特点

抽象、封装、继承、多态

10.    什么是动态多态性和静态多态性

静态多态性  是通过函数重载(同名不同参数)实现的,在程序编译时就知道调用函数的全部信息,即编译时就知道调用的是哪个函数

动态多态性   不在编译时确定调用哪个函数,而是在程序运用过程中才动态的确定操作所针对的对象。是通过虚函数来实现的,又叫运行时多态

拓展:

析构函数:

不返回任何值,没有函数类型,没有函数参数,不能不能被重载。一个类可以有多个构造函数却只有一个析构函数

声明虚析构函数P217

Virtual float area() {return 0;}

转化为纯虚析构函数声明

Virtual float area() const=0;   或者直接  virtual float area()=0;  或者  virtual area()=0;

子类中析构函数重写

        virtual double area1(int  ro)  { return r*r; }

纯虚函数的调用:

纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对她进行定义,实现多态性。

构造函数

#include <iostream>

using namespace std;

class Point

{

       public:

              Point()

              {cout<<"this is point 构造"<<endl;}

              ~Point()

              {cout<<"this is point 析构函数"<<endl;}

       private:

              int a;

};

class Circle:public Point

{

public:

       Circle()

       {cout<<"this is circle 构造"<<endl;}

       ~Circle()

       {cout<<"this is Circlre 析构"<<endl;}

};

int main()

{

}

普通析构函数时

变成虚析构函数时

相关推荐