前十三讲复习
本讲基本要求
u 掌握:1、前四章中主要涉及的有关面向对象方面的所有基本概念。
2、C++程序设计有基本语法。
重点、难点
u C++程序设计有基本语法。
一、理论知识复习
1、何为软件危机(software crisis)?
60年代中期,软件开发出现了人们难以控制的局面,即所谓软件危机。落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。
2、面向对象程序设计的基本思想是什么?
面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,降低、分解问题的难度和复杂性,提高整个求解过程的可控制性、可监测性和可维护性,从而达到以较小的代价和较高的效率获得较满意效果的目的。
3、 面向对象程序设计中的对象(object)举例说明
客观世界中任何一个事物都可以看成一个对象(object)。或者说,客观世界是由千千万万个对象组成的。对象可以是自然物体(如汽车、房屋、狗熊),也可以是社会生活中的一种逻辑结构(如班级、支部、连队),甚至一篇文章、一个图形、一项计划等都可视作对象。
4、面向对象中抽象的作用?举例说明?
抽象的作用是表示同—类事物的本质。C和C++中的数据类型就是对一批具体的数的抽象。例如,“整型数据” 是对所有整数的抽象。
5、面向对象程序设计封装性(encapsulation)方法两方面的含义?
所谓“封装”,指两方面的含义:一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不于扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。
6、面向对象程序设计的三大特点?
对象的封装、继承、多态是面向对象程序设计的三大特点。
7、简述类和对象的关系?
1、类是对象的类型。2、类是一批有共性和特征的对象。3、类是对象的抽象,而对象是类的实例。4、类是对象的模板。5、对象是类的一个变量。
8、用公式来表述在面向对象程序设计中程序=?并加以说明?
程序=(对象+对象+对象+…)+消息 或: 程序=对象s+消息
“对象s”表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象,以及确定向这些对象发出的命令,使各对象完成相应的操作。
9、简述面向对象的软件工程包括以下五个部分?
⒈面向对象分析(object oriented analysis,OOA)。⒉面向对象设计(Object oriented design,OOD)。⒊面向对象编程(object oriented programming,OOP)。 ⒋面向对象测试(object oriented test,OOT)。⒌面向对象维护(Object oriented soft maintenance,OOSM)
10、简述面向对象的软件开发的五个过程?
⒈面向对象分析(object oriented analysis,OOA)。⒉面向对象设计(Object oriented design,OOD)。⒊面向对象编程(object oriented programming,OOP)。 ⒋面向对象测试(object oriented test,OOT)。⒌面向对象维护(Object oriented soft maintenance,OOSM)。
11、类的对外接口?
在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员赋值,显示数据成员的值,对数据进行加工等)。公用成员函数是用户使用类的公用接口(pubic interface),或者说是类的对外接口。
12、面向对象程序设计中的信息隐蔽?
类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现(private implementation)。这种“类的公用接口与私有实现的分离”形成了信息隐蔽。
13、面向对象程序设计中的“方法”?
类的成员函数在面向对象程序理论中被称为“方法”(method),“方法”是指对数据的操作。一个“方法”对应一种操作。显然,只有被声明为公用的方法(成员函数)才能被对象外界所激活。
14、面向对象程序设计中的“消息”?
所谓“消息”,其实就是一个命令,由程序语句来实现。前面的stud.display();就是向对象stud发出的一个“消息”,通知它执行其中的display“方法” 。
15、面向对象程序设计中的“构造函数”?
A:提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。
B:构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。它不具有任何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。
16、面向对象程序设计中的“析构函数”?
析构函数(destructor)是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。析构函数是与构造函数作用相反的函数。当对象的生命期结束时,会自动执行析构函数。
二、常用知识复习
1、软件的发展和应用受到硬件发展的制约,从计算机诞生至今计算机编程语言发展过程大致可分为3个阶段。
2、 软件危机(software crisis)是落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象,主要包含2方面的问题。
3、C++程序设计步骤首先用C++语言编写程序,将目标文件连接,再是对源程序进行编译, 运行程序。
4、不是C++程序的调试和测试错误的三种类型是:
1)语法错误:即不符合C++语言的语法规定。
2) 逻辑错误:这是指程序无语法错误,也能正常运行,但是结果出错。
3) 运行错误:有时程序既无语法错误,又无逻辑错误,但程序不能正常运行或结果不对。
5、在C++程序中,要求执行一个程序后必须向操作系统返回一个数值,如果程序正常执行,则向操作系统返回数值0,否则一般返回数值-1。
6、在C++程序中,一般在主函数main前面加一个类型声明符int ,表示main函数的返回值类型。标准C++要求main函数必须声明为这种类型的函数。
7、在C语言中常用#define命令来定义符号常量,无变量的属性, 无数据类型,无地址,不占用存储单元
8、C++提供了用const定义常变量的方法,正确的说法是:具有变量的属性;有数据类型;占用存储单元;有地址。
9、关于引用的简单使用:
用并不是一种独立的数据类型,它必须与某一种类型的数据相联系。引用与所代表变量共享同一内存单元,系统并不为引用另外分配存储空间。当及a的前面有类型符时(如int &a),它必然是对引用的声明;如果前面没有类型符(如p=&a),此时的&是取地址运算符。对引用的初始化,可以用一个变量名,可以用其中它引用。
10、关于引用的简单使用正确说法的是:用并不是一种独立的数据类型,它必须与某一种类型的数据相联系;引用与所代表的变量共享同一内存单元,系统不为引用另外分配存储空间;当及a的前面有类型符时(如int &a),它必然是对引用的声明;如果前面没有类型符(如p=&a),此时的&是取地址运算符;引用在初始化后不可以被重新声明为另一变量的别名。
11、关于定义字符串变量使用string类的功能时,必须在本文件的开头应加上#include<string> 。
12、以下正确说法是:不可以建立void类型的引用;不能建立引用的数组;可以用const对引用加以限定,不允许改变该引用的值;可以用常量或表达式对引用进行初始化,但此时必须用const作声明。
13、在C++中新增的动态分配/撤销内存的运算符为: new和delete。C中使用malloc和free
14、对字符串数组以下表述正确的是:在一个字符串数组中包含若干个元素,每个元素相当于—字符串变量;并不要求每个字符串元素具有相同的K度,长度可能发生变化;在字符串数组的每一个元素中存放一个字符串,而不是一个字符;每一个字符中元素中包含字符串本身的字符同时不包括"\0"。
15、定义对象3种方法是:先声明类类型,然后再定义对象;在声明类类型的同时定义对象;不出现类名,直接定义对象。
16、成员函数不在类体内定义时,如果想将这些成员函数指定为内置函数,应当用inline关键字作显式声明。
17、用struct声明的类,如果对其成员不作属性声明,系统将其默认为: public。
18、类(class)就是对象的类型,设计类时不能把类中的全部成员与外界隔离,一般是把公有函数作为对外界的接口。
19、在类外定义的成员函数何种规模时,很小而调用频率较高才将此成员函数指定为内置函数。
20、类的对象所占的物理内存空间大小只取决于该对象中类中数据成员所占空间?
21、private称为成员访问限定符。用它们来声明各成员的访问属性。被声明为私有的(private)成员数据,只能被本类中的成员函数引用。
22、有以下定义:Class Time
{ public:
int hour; };
int main()
{ Time t1,*p; p=&t1;
Time &t2= t1; return 0 ;}
以下对t1数据成员hour访问不正确的是: B、p. hour 应该p-> hour。
23、关于类的成员函数以下说法正确的是:类内定义成员函数的代码段不占用对象的存储空间;类外定义成员函数的代码段不占用对象的存储空间;inline(内置)函数的代码段不占用对象的存储空间;逻辑的角度,成员函数是封装在对象中的。
24、一般在C++中,只有被声明为公用的方法(成员函数)才能被对象外界所激活。外界是通过发“消息”来激活有关方法的。
25、如果num是Student类的私有数据成员,以下正确说法是:num数据成员不能被外界引用;在类外只能调用公用的成员函数引用num数据成员;在类体函数设计时可引用num数据成员;Student类的对象不可以引用num数据成员。
26、有关构造函数的使用,正确的说明是:在类对象进入其作用域时调用构造函数,在构造函数的函数体中可以对数据成员赋初值,可以包含其他语句,构造函数不需用户调用,也不能被用户调用,构造函数没有返回值,因此也不需要在定义构造函数时声明类型。
27、类的成员函数在面向对象程序理论中被称为“方法”,它是指对数据的操作。一个它对应一种操作。
28、关于常数据成员以下说法正确的是:常数据成员的值是不能改变的,不能采用在构造函数中对常数据成员赋初值的方法对常数据成员进行初始化,只能通过构造函数的参数初始化表对常数据成员进行初始化,一个数据成员为常数据成员后,但不同对象中的该数据成员的值可以是不同的。
29、有关构造函数的使用,正确说明是:构造函数不需用户调用,也不能被用户调用;构造函数有无返回值,因此需要在定义构造函数时不需要声明类型;在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句;在类对象进入其作用域时调用构造函数。
30、静态数据成员是一种特殊的数据成员,它以关键字static开头以下关于静态数据成员正确说法是:静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间,静态数据成员本类中每个对象都不分别为它保留一份空间,静态数据成员可以初始化,但只能在类体外进行初始化,静态数据成员的值对所有对象都是一样的。
31、关于常函数成员正确说法的是:则只能引用本类中的数据成员,而不能修改它们;const数据成员可以被const成员函数引用;const是函数类型的一部分,在声明函数、定义函数时都要有Cons,调用时不用声明Const;常成员函数可以引用const数据成员,也可以引用非const的数据成员。
32、以下关于静态成员函数正确说法是:在类中声明函数的前面加static就成了静态成员函数;静态成员函数不是对象的一部分,而是类的一部分;允许通过对象名调用静态成员函数,只是用对象的类型而已;静态成员函数不能访问本类中的非静态数据成员。
三、概念知识复习
1、第一个真正的C++编译系统是1988年诞生的。C++2.0版本于1989年出现,它作了重大的改进,包括了类的多继承。
2、 ANSI C++ 标准草案是以C++4.0版本为基础制定的,1997年 ANSI C++ 标准正式通过并发布。
3、C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的基础上开发成功的。
4、 为了解决软件设计危机,在20世纪80 年代提出了面向对象的程序设计(OOP)思想,这就需要设计出能支持面向对象的程序设计方法的新语言。
5、class和typename的作用相同,都是表示“类型” 名,二者可以互换。
6、以前的C++程序员都用class。typename 是不久前才被加到标准C++中的,因为用class容易与C++中的类混淆。而用其表示类型名很清楚,肯定是类型名(而不是类名)。
7、C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能,这就是函数的重载。
8、 “重载”(over loading),即重新赋予它新的含义,其实就是“一物多用”。
9、在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前必须对所调用的函数作函数原型声明,这不是建议性的,而是强制性的。
10、 在C语言程序中,如果函数调用的位置在函数定义之前,则应在函数调用之前对所调用的函数做声明,但如果所调用的函数是整型的,也可以不进行函数声明。
11、C++定义函数时如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值。指定默认值的参数必须放在形参表列中的最右端。
12、一个函数不能既作为重载函数,又作为有默认参数的函数。
13、“::”是作用域限定符或称作用域运算符,用它声明成员是属于哪个类的。
14、使用带有默认参数的函数时要注意,函数的定义在函数调用之后,必须在函数声明中给出默认值,在函数定义时可以不给出默认值。
15、在C++中,变量的“引用”就是变量的别名,建立它的作用是为一个变量起另一个名字。
16、C++之所以增加“引用”,主要是利用它作为函数参数,以扩充函数传递数据的功能。
17、在C++语言中,函数的参数传递有以下三种情况:将变量名作为实参、传递变量的指针、传送变量的别名。
18、 在C++调用函数时有两种传递数据的方式:一种是常用的传值方式调用,另一种是引用方式调用。
19、程序小有两个a变量:一个是全局变量a,另一个是、main函数中的变量a。根据规定,在main函数中局部变量将屏蔽全局a变量。
20、 “::”a表示全局作用域中的变量a。请注意:不能用“::”访问函数中的局部变量。
21、C++除了可以使用字符数组处理字符串外,还提供了一种更方便的方法:用字符串类型(stung类型)定义字符串变量。
22、 实际上,string并不是C++语言本身具有的基本类型(是 C++本身提供的基本类型),它是在C++标准库中声明的一个字符串类。
23、将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函数都指定为public。
24、类的成员函数(简称类函数)是函数的一种,它与一般函数的区别只是:它是属于一个类的成员,出现或声明在类体中。
25、类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。
26、 如果在作用域运算符“::”的前面没有类名,或者函数名前面既无类名又无作用域运算符“::”,则说明函数是全局或普通函数。
27、类这种数据类型中的数据既包含数据,也包含操作数据的函数。
28、类体中是类的成员列表。除了数据部分以外,还包括了对这些数据操作的函数。这就体现了把数据和操作封装在一起。
29、如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它。
30、在执行delete运算符时,在释放内存空间之前,自动调用析构函数函数,完成有关善后清理工作。
31、如果想在同类的多个对象之间实现数据共享,一般不要用全局对象,可以用静态的数据成员。
32、静态数据成员是一种特殊的数据成员,可实现多个对象之间实现数据共享。它以关键字static 开头。
33、运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载
34、用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。
四、程序设计复习:
1、输入、输出程序设计
#include <iostream>
using namespace std;
int main()
{ int a,b,sum;
cin>>a>>b;
sum=a+b;
cout<<"a+b="<<sum<<endl;
return 0; }
当输入:23 13(回车)
答案:
2、输入、输出操作
#include <iostream>
using namespace std;
int main()
{ int max(int x,int y);
int a,b,c;
cin>>a>>b;
c=max(a,b);
cout<<"max="<<c<<endl;
return 0; }
int max(int x,int y)
{ int z;
if(x>y) z=x;
else z=y;
return(z); }
输入:33 63(回车)
输出:
3、含变量别名的输入、输出
#include <iostream>
using namespace std;
int main( )
{ int a=20;
int &b=a;
a=a/2;
cout<<"a="<<a<<";"<<"b="<<b<<endl;
b=b*b;
cout<<"a="<<a<<";"<<"b="<<b<<endl;
return 0; }
答案
4、含变量别名的输入、输出
#include <iostream>
using namespace std;
int main( )
{ int a=5;
int &b=a;
a=++a;
cout<<"a="<<a<<";"<<"b="<<b<<endl;
b=b/2;
cout<<"a="<<a<<";"<<"b="<<b<<endl;
return 0; }
答案:
5、重载(运算符)
#include <iostream>
using namespace std;
class Complex
{ public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
double get_real();
double get_imag();
void display();
private:
double real;
double imag;
};
double Complex::get_real()
{ return real; }
double Complex::get_imag()
{ return imag; }
void Complex::display()
{ cout<<"("<<real<<","<<imag<<"i)"<<endl; }
Complex operator + (Complex &c1,Complex &c2)
{
return Complex(c1.get_real()+c2.get_real(),c1.get_imag()+c2.get_imag());
}
int main()
{Complex c1(3,4),c2(5,-10),c3;
c3=c1+c2;
cout<<"c3=";
c3.display();
return 0;
}
答案:
6、重载(运算符)
#include <iostream>
using namespace std;
class Complex
{ public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator-(Complex &c2);
void display();
private:
double real;
double imag; };
Complex Complex::operator-(Complex &c2)
{ Complex c;
c.real=real-c2.real;
c.imag=imag-c2.imag;
return c; }
void Complex::display()
{ cout<<"("<<real<<","<<imag<<"i)"<<endl;}
int main()
{ Complex c1(3,4),c2(5,-10),c3;
c3=c1-c2;
cout<<"c1-c2=";
c3.display();
return 0; }
答案:
7、函数调用(含默认参数)
#include <iostream>
using namespace std;
float volume(float h=10,float r=2)
{ float z;
return z=3*r*r*h; }
int main()
{ float a,b,c;
a=volume();
b=volume(1);
c=volume(2,3);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
return 0; }
答案:
8、函数调用(含默认参数)
#include <iostream>
using namespace std;
float area(float r=2)
{ float z;
return z=2*3*r; }
int main()
{ float a,b;
a=area();
b=area(1);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0; }
答案:
9、字符串数组的输入、输出
#include <iostream>
#include<string>
using namespace std;
int main()
{ string name[3]={"lifun","xvcheng","zxcvbn"};
name[1][2]='a';
cout<<"name="<<name[1]<<endl;
return 0; }
答案:
10、字符串数组的输入、输出
#include <iostream>
#include<string>
using namespace std;
int main()
{ string name="taien";
name[3]='a';
cout<<"name="<<name<<endl;
return 0; }
答案:
11、含参数的构造函数
#include <iostream>
using namespace std;
class Student
{ public:
Student(int n,float s):num(n),score(s){}
void change(int n,float s) {num=n;score=s;}
void display(){cout<<num<<" "<<score<<endl;}
private:
int num;
float score; };
int main()
{ Student stud(101,78.5);
stud.display();
stud.change(101,80.5);
stud.display();
return 0; }
答案
12、含参数的构造函数
#include <iostream>
using namespace std;
class Box
{ public:
Box(int w=10,int h=10,int len=10);
int volume();
private:
int height;
int width;
int length; };
Box::Box(int w,int h,int len)
{ height=h;
width=w;
length=len; }
int Box::volume()
{ return(height*width*length); }
int main()
{ Box box1; //没有给定实参
cout<<"The volume of box1 is "<<box1.volume()<<endl;
Box box2(15); //只给定1个实参
cout<<"The volume of box2 is "<<box2.volume()<<endl;
Box box3(15,30); //只给定2个实参
cout<<"The volume of box3 is "<<box3.volume()<<endl;
Box box4(15,30,20); //给定3个实参
cout<<"The volume of box4 is "<<box4.volume()<<endl;
return 0; }
答案