面向对象程序设计期末复习题及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++面向对象程序设计复习
试题类型1、单项选择题(在每小题的四个备
选答案中,选出一个正确答案,并将正确答案的序号填在题干的括号内。
15题,每小题2分,共30分) [主要从作业题目中抽出来]
2. 填空题。
(10题,每小题3分,共30分)
3、阅读程序,写出程序运行结果。
【也称计算题】(3题,每小题5分,共15分)
4、程序编制题【也称综合分析题】。
(第1、2题每题8分,第3题9分,共25分) 重点复习内
容
打*号是重点,打▲号是编程题出题范围
* 基本概念,对象,消息,类。
面向对象系统特性,封装性,继承性,多态性。
*▲C++类的构成,类与对象,构造与析构,动态存储,类嵌套。
静态成员,对象数组,友元。
*函数重载。
运算符重载。
*引用定义与引用参数
* 基类与派生类的定义。
* 基类及派生类的访问权(含派生类对基类的访问、通过派生类对象对基类的访问)和初始化。
多继承与虚基类。
*多态性与虚函数。
纯虚函数、抽象类。
*▲函数模板。
*▲使用类来定义对象并在程序中的应用题型样题
填空题 1. 假定AB为一个类,则执行“AB a[10];”语句时,系统自动调用该类的构造函数的次数为_________。
答案:10
2.可以用p.a的形式访问派生类对象P的基类成员a,其中a是_________。
答案:公有继承的公有成员
3.能作为重载函数的调用的依据是_________。
答案:参数个数、参数类型
4.在进行完任何C++流的操作后,都可以用C++流的有关成员函数检测流的状态;其中只能用于检测输入流是否结束状态的操作函数名称是_________
答案:eof
5.函数重载是指_________。
答案:两个或两个以上的函数取相同的函数名,但形参的个数或类型不同
6.在派生类中重新定义虚函数时必须在_________ 方面与基类保持一致。
答案:参数个数
阅读程序例题【计算题】
1.分析以下程序的执行结果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample() {x=y=0;}
Sample(int a,int b) {x=a;y=b;}
~Sample()
{
if(x==y)
cout<<“x=y”<<endl;
else
cout<<“x!=y”<<endl;
}
void disp()
{
cout<<“x=”<<x<<“,y”=<<y<<endl;
}
};
void main()
{
Sample s1,s2(2,3);
s1.disp();
s2.disp();
}
解:
x=0,y=0
x=2,y=3
x!=y
x=y
2.分析以下程序的执行结果
#include<iostream.h>
int add(int x,int y)
{
return x+y;
}
int add(int x,int y,int z)
{
return x+y+z;
}
void main()
{
int a=4,b=6,c=10;
cout<<add(a,b)<<,<<add(a,b,c)<<endl; }
解:
10,20 3.分析以下程序执行结果
#include<iostream.h>
int add(int x,int y)
{
return x+y;
}
double add(double x,double y)
{
return x+y;
}
void main()
{
int a=4,b=6;
double c=2.6,d=7.4;
cout<<add(a,b)<<","<<add(c,d)<<endl; }
解:
10,10
4.分析以下程序执行的结果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};
void main()
{
Sample s1,s2(1,2),s3(10,20);
Sample *pa[3]={&s1,&s2,&s3};
for(int i=0;i<3;i++)
pa[i]->disp();
}
解:x=0,y=0
x=1,y=2
x=10,y=20 5. 分析以下程序的执行结果:
#include<iostream.h>
class base
{
int n;
public:
base(){};
base (int a)
{
cout << "constructing base class" << endl; n=a;
cout << "n= "<< n << endl;
}
~base() { cout << "destructing base class" << endl; }
};
class subs : public base
{
int m;
public:
subs(int a, int b) : base(a)
{
cout << "constructing sub class "<< endl; m=b;
cout << "m= "<< m << endl;
}
~subs() { cout << "destructing sub class "<< endl; }
};
void main ()
{
subs s(1,2);
}
解:
constructing base class
n= 1
constructing sub class
m= 2
destructing sub class
destructing base class
6.分析以下程序的执行结果:
#include <iostream.h>
class Sample
{
protected:
int x;
public:
Sample() { x=0; }
Sample(int val) { x=val; }
void operator++() { x++; }
};
class Derived:public Sample
{
int y;
public:
Derived():Sample(){ y=0; }
Derived(int val1,int val2):Sample(val1){ y=val2; }
void operator--(){ x--;y--;}
void disp()
{
cout<<"x="<< x << ",y=" << y << endl; }
};
void main ()
{
Derived d(3,5);
d.disp();
d++;
d.disp ();
d--;
d--;
d.disp();
}
解:
x=3,y=5
x=4,y=5
x=2,y=3
7 分析以下程序执行结果:
#include <iostream.h>
class A
{
public:
A(char *s) { cout << s << endl; }
~A() {}
};
class B:public A {
public:
B(char *sl,char *s2) :A(sl)
{
cout << s2 << endl;
}
};
class C:public A
{
public:
C(char *sl,char *s2) :A(sl)
{
cout << s2 << endl;
}
};
class D:public B,public C
{
public:
D(char *sl,char *s2,char *s3,char *s4) :B(sl,s2),C(sl,s3)
{
cout << s4 << endl;
}
};
void main ()
{
D d("class A","class B","class C","class D");
}
解:
class A
class B
class A
class C
class D 补充例题
1.分析以下程序的执行结果
#include<iostream.h>
template <class T>
T max(T x,T y)
{ return (x>y?x:y); }
void main()
{ cout<<max(2,5)<<“,”<<max(3.5,2.8)<<endl; }
解答:5,3.5 2.分析以下程序的执行结果
#include<iostream.h>
void main()
{
int a[]={10,20,30,40},*pa=a;
int *&pb=pa;
pb++;
cout<<*pa<<endl;
}
解答:
输出为:20 3.分析以下程序的执行结果
#include<iostream.h>
template <class T>
T abs(T x)
{ return (x>0?x:-x); }
void main()
{ cout<<abs(-3)<<“,”<<abs(-2.6)<<endl; }
解答:输出为:3,2.6
4.分析以下程序的执行结果
#include<iostream.h>
class Sample
{
char c1,c2;
public:
Sample(char a){c2=(c1=a)-32;}
void disp()
{ cout<<c1<<“转换为”<<c2<<endl; } };
void main()
{
Sample a('a'),b('b');
a.disp();
b.disp();
}
解答:
a转换为A
b转换为B 5.分析以下程序的执行结果
#include<iostream.h>
void main()
{
int a;
int &b=a; // 变量引用
b=10;
cout<<“a=”<<a<<endl;
} 解答:
输出为:a=10 6.分析以下程序的执行结果
#include<iostream.h>
class Sample
{
int x;
public:
Sample(){};
Sample(int a){x=a;}
Sample(Sample &a){x=a.x++ +10;}
void disp(){cout<<“x=”<<x<<endl; }
};
void main()
{ Sample s1(2),s2(s1);
s1.disp();
s2.disp();
}
解答:
x=3 // ++运算的结果
x=12 // 2+10
7.分析以下程序的执行结果
#include<iostream.h>
class Sample
{
int x;
public:
Sample(){};
Sample(int a){x=a;}
Sample(Sample &a){x=a.x+1;}
void disp(){cout<<“x=”<<x<<endl; } };
void main()
{ Sample s1(2),s2(s1);
s2.disp();
}
解答:
输出为:x=3。
程序编制题例题【综合分析题】
例1,写出一个梯形类,操作有求面积和周长
分析:由于要求梯形的面积和周长,那就要为梯形提供上底,下底,高,左边长,右边长等属性。
因此,梯形类描述为:
Class echelon
{
Int top,bottom,height,llength,rlength;
Public:
Echelon( ) { 。
} //构造函数
Int Area( ){ 。
} //求面积
Int Perimeter( ) { 。
} //求周长
} 2. 设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。
解:
circle类包含私有数据成员radius和求圆面积的成员函数getarea();
table类包含私有数据成员height和返回高度的成员函数getheight()。
roundtable类继承所有上述类的数据成员和成员函数,添加了私有数据成员color和相应的成员函数。
本题程序如下:
#include<iostream.h>
#include<string.h>
class circle
{
double radius;
public:
circle(double r) { radius=r; }
double getarea() { return radius*radius*3.14; } };
class table
{
double height;
public:
table(double h) { height=h; }
double getheight() { return height; }
};
class roundtable : public table,public circle
{
char *color;
public:
roundtable(double h, double r, char c[]) : circle (r) , table (h)
{
color=new char[strlen(c)+1];
strcpy (color, c);
}
char *getcolor() { return color; }
};
void main()
{
roundtable rt(0.8,1.2,黑色);
cout << 圆桌属性数据: << endl;
cout << 高度:<<rt.getheight() << 米<< endl; cout << 面积:<<rt.getarea() << 平方米<< en dl; cout << 颜色:<<rt.getcolor() << endl;
}
3.编写程序,定义一个类test,其成员数据及函数要求如下:
(1)私有数据成员int data
(2)构造函数两个test () 及test(int d),前者将(1)中的数据成员data值设为0;后者将(1)中的数据成员data设定为指定值d
(3)成员函数int setdate()能在键盘读入一个数值,然后将该数值赋给data 4.定义一个抽象类tea代表茶叶,它有1个double类型的保护数据成员c ost代表种植成本,它还有一个纯虚函数price用来计算售价:double price(void)函数返回值为茶叶的售价。
由tea派生出具体类blacktea(红茶),要求如下:
(1)类中定义保护成员数据double o_cost,表示红茶的经营成本
(2)定义构造函数blacktea(double btc,double bto_
c),将cost 和o_cost,数据成员设定为指定值
(3)重载price计算出blacktea 的售价。
(假设:bl acktea 售价=(cost + o_cost)*1.2)
5.编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。
分析:
设计一个学生类Stud,除了包括no(学号)、name(姓名)和deg(成绩)数据成员外,有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。
在main()函数中定义了一个对象数组用于存储输入的学生数据。
本题程序如下:
#include<stdio.h>
#include<string.h>
#define N 3
class Stud
{
int no;
char name[10];
int deg;
static int num;
static int sum;
public:
void setdata(int n,char na[],int d)
{
no=n; deg=d;
strcpy(name,na);
sum+=d;
num++;
}
static double avg()
{
return sum/num;
}
void disp()
{
printf( %-5d%-8s%3d\n,no,name,deg); }
};
int Stud::sum=0;
int Stud::num=0;
void main()
{
Stud st[N];
int i,n,d;
char na[10];
for(i=0;i<N;i++)
{
printf(输入学号姓名成绩:);
scanf(%d%s%d,&n,na,&d);
st[i].setdata(n,na,d);
}
printf(输出数据\n);
printf( 学号姓名成绩\n);
for(i=0;i<N;i++)
st[i].disp();
printf( 平均分=%g\n\n,Stud::avg()); }
本程序的执行结果如下:
输入学号姓名成绩: 1 stud1 89
输入学号姓名成绩: 2 stud2 78
输入学号姓名成绩: 3 stud 84
输出数据
学号姓名成绩
1 stud1 89
2 stud2 78
3 stud3 84
平均分=83 6.请编写一个程序,以实现在屏幕上显示如下的乘法表。
1) 1
2) 2 4
3) 3 6 9
4)4 8 12 16
5)5 10 15 20 25
6)6 12 18 24 30 36
7) 7 14 21 28 35 42 49
8)8 16 24 32 40 48 56 64
9) 9 18 27 36 45 54 63 72 81 7. P463-P464 函数模板
需要掌握的内容
面向对象程序设计的三大特征
类和对象
类: C++的一种数据类型,使用类的变量则称为对象。
C++的类是对象的抽象,是进行封装和数据隐藏的工具,包括:数据成员和成员函数。
一个类可以声明多个对象,对象之间代码共享,数据独立。
C++类的说明
public :可被本类以外的函数访问,是类与外部的接口;
private :只能被该类成员函数和友元函数存取和调用;
protected:可被本类和本类的派生类的成员函数访问,用于类的继承。
成员函数
默认时在类中定义的项都是私有的,类成员函数的外部实现:
使用对象名引用对象的公有成员函数。
方法如下:对象名.成员函数名(参数列表)
内联函数的概念;定义内联函数的两种格式
1)函数体放在类体内
2)函数体放在类体外,使用inline关键字
构造函数
构造函数的作用是在对象被创建时为对象分配内存空间,对类的数据成员初始化并执行对象的其他内部管理操作。
构造函数与类同名
构造函数可接收参数但不能有返回值,允许重载。
当创建一个类的对象时,系统会自动调用类的构造函数。
若未给类定义构造函数,则编译系统将为该类生成一个默认的构造函数,它没有参数,只简单地把对象中的每个实例变量初始化为0。
析构函数一、C++语言概述
1. 了解C++语言的基本符号。
2. 了解C++语言的词汇(保留字、标识符、常量、运算符、标点符号等)。
3. 掌握C++程序的基本框架(结构程序设计框架、面向对象程序设计框架等)。
4. 能够使用Visual C++ 6.0集成开发环境编辑、编译、运行与调度程序。
二、数据类型、表达式和基本运算
1. 掌握C++数据类型(基本类型,指针类型)及其定义方法。
2. 了解C++的常量定义(整型常量,字符常量,逻辑常量,实型常量,地址常量,符号常量)。
3. 掌握变量的定义与使用方法(变量的定义及初始化,全局变量,局部变量)。
4. 掌握C++运算符的种类、运算优先级和结合性。
5. 熟练掌握C++表达式类型及求值规则(赋值运算,算术运算符和算术表达式,关系运算符和关系表达式,逻辑运算符和逻辑表达式,条件运算,指针运算,逗号表达式)。
三、C++的基本语句
1. 掌握C++的基本语句,例如赋值语句、表达式语句、复合语句、输入、输出语句和空格语句等。
2. 用if语句实现分支结构。
3. 用switch语句实现多分支选择结构。
4. 用for语句实现循环结构。
5. 用while语句实现循环结构。
6. 用do…while语句实现循环结构。
7. 转向语句(goto,continue,break和return)。
8. 掌握分支语句和循环语句的各种嵌套使用。
四、数组、指针与引用
1. 掌握一维数组的定义、初始化和访问,了解多维数组的定义、初始化和访问。
2. 了解字符串与字符数组。
3. 熟练掌握常用字符串函数(strlen,strcpy,streat,strcmp,strstr等)。
4. 指针与指针变量的概念,指针与地址运算符,指针与数组。
5. 引用的基本概念,引用的定义与使用。
注意事项:搞清楚指针与地址运算符的区别,指针与引用的区别。
五、掌握函数的有关使用
1. 函数的定义方法和调用方法。
2. 函数的类型和返回值。
3. 形式参数与实在参数,参数值的传递。
4. 变量的作用域、生存周期和存储类别(自动、静态、寄存器,外部)。
5. 递归函数。
6. 内联函数。
7. 带有缺省参数值的函数。
注意事项:C++中,函数之间传递参数有传值和传地址两种传递方式。
六、熟练掌握类与对象的相关知识
1. 类的定义方式、数据成员、成员函数及访问权限(public,private,protected)。
2. 对象和对象指针的定义与使用。
3. 构造函数与析构函数。
4. 静态数据成员与静态成员函数的定义与使用方式。
5. 常数据成员与常成员函数。
6. This指针的使用。
7. 友元函数和友元类。
8. 对象数组与成员对象。
七、掌握类的继承与派生知识
1. 派生类的定义和访问权限。
2. 继承基类的数据成员与成员函数。
3. 基类指针与派生类指针的使用。
4. 虚基类。
八、了解多态性概念
1. 虚函数机制的要点。
2. 纯虚函数与抽象基类,虚函数。
3. 了解运算符重载。
九、模板
1. 掌握简单了解函数模板的定义和使用方式。
2. 掌握类模板的定义和使用方式,能够写出模板类呈现。
十、输入输出流
1. 掌握C++流的概念。
2. 能够使用格式控制数据的输入输出。
3. 掌握文件的I/O操作。
详细的复习内容
一、C++语言语法基础
1、标识符
是以字母或下划线开头,由字母、数字、下划线组成的用来标识变量、函数、自定义类型的符号,它不能是C或C++的保留字。
2、变量声明与数据类型
变量的声明如右:类型名称变量名,变量名=初值;
指针变量的声明:类型名称*变量名;数组的声明:类型名称数组名[数组元素个数]={初值,初值,初值……};
标准数据类型:bool char int long unsigned float double
标准类型可以强制类型转换例如:float x;int y=(int)x;
自定义数据类型:结构struct 联合union 类class
定义方式:struct 自定义类型名
{ 成员变量类型
成员变量名;
…………
};
类类型除外
3、运算符与表达式
运算符:一元运算符:++、--、*、& 等
二元运算符:+、-、*、/、+=、||、&& 等
三元运算符:?:
分量运算符:->、.
下标运算符:[ ]
括弧运算符:()
动态存储运算符:new、delete
注意在一个表达式中运算符的优先级。
其中尤其要注意++、--、->、.、*、&、=运算符。
4、C或C++语句
五种语句:表达式语句:例如:
y=x*3+4;
空语句:;
控制语句:例如:break;if ( ***** ) ……else
函数调用语句:例如:
printf( ***** );
复合语句:例如:
{ x=9+y*5;
cout<<x;}
除了复合语句以} 号结束外,其余的语句全是用;结束。
语句可以混合使用:例如if (x!=3) { y=7;printf(“%d”,x*y);} 其中有复合、控制、表达式、函数调用语句。
5、三种程序结构
1)顺序结构
2)分支结构用if else switch…… case……default break 等控制。
3)循环结构用for while do……while break continue 控制
6、函数
函数在C或C++中就是子程序
函数的声明返回类型函数名(参数类型形式参数名,………)
{ 函数体
return 返回值;}
其中void型函数无return 语句。
如果不立即写出函数的实现,只是一个函数原形的声明,可以省略形式参数,如下:
返回类型函数名(参数类型,………);
函数的参数可以缺省,例如:int f2 (int x, int y=8) { ……… }
同名函数如果参数的个数或类型不同,编译器能自动识别该调用那一个函数,这叫函数重载,例如:void f2 ( ){……} 与void f2 (int x) {……}
7、指针
指针就是地址,指针声明见变量声明一节,指针指向同类变量:指针名=&变量名;
取得指针指向的地址中的内容:*指针名
指针可以运算和赋值,但不能直接赋值数字,赋零除外,这时零表示空指针。
数组名就是固定指向数组开头的常数指针。
8、结构
结构的声明见变量声明,用结构类型定义变量:C中struct 结构名变量名;
C++中结构名变量名;
结构成员变量的访问:通过结构变量:结构变量.成员变量
通过结构指针:指针名->成员变量
在C++中结构是类的一种特例,也可以有成员函数,但它与类不同,它的成员缺省时是公有的。
二、面向对象的程序设计
1、类与对象的概念
类是一种自定义类型,是对一类对象的抽象,是对象的模板。
对象是一个实体,是类的实例,对象由类建立,对象封装了数据和对数据操作的函数,有一个边界,从外部对对象私有部分的访问是被禁止的,对对象的操作要通过它对外的公共接口(公有区)进行。
同类对象有相同的成员函数,相同的数据成员集合,但名字不同,数据成员的值也不一定相同(即对象的状态不同)。
对象的数据成员又叫对象的属性,对象的成员函数又叫对象的方法,调用对象的方法叫向对象发送消息。
对象之间靠消息联系。
面向对象的程序设计就是向未知对象发送消息的程序设计,面向对象的程序就是一组通信的对象。
2、类的声明
class 类名:[public] 基类1名,[public] 基类2名,……
{ private:
类的私有成员,从对象外部不能访问,它的派生类也不能访问,只能它自己访问。
protected:
类的保护成员,从对象外部不能访问,它的派生类和它自己可以访问。
public:
类的公有成员,对外公开的、可以任意访问的成员。
};
成员变量的声明:在类的{}中象普通变量一样进行声明,但不能赋初值。
成员变量在对象中是这个对象的所有成员函数的全局变量。
成员函数的声明:在类的{}中先声明函数的原形,再在类的{}之外:
返回类型类名::函数名(参数类型形式参数名,………)
{ 函数体} 3、对象定义与使用
直接定义对象:类名对象名(构造函数实际参数);
通过定义类指针定义对象:类名*指针名;
指针名=new 类名(构造函数实际参数);
通过定义类指针定义的对象需要用删除:delete 指针名;
直接定义对象数组:类名数组名[数组元素个数];
在定义对象数组时初始化数组:类名数组名[数组元素个数]={类名(构造参数),……};
通过类指针定义数组:指针名=new 类名[数组元素个数];
通过类指针定义对象数组不能调用带参数的构造函数对数组进行初始化。
通过类指针定义的数组的删除:deltet [ ]指针名;
使用对象成员:
直接定义的对象:对象名.成员名
通过指针定义的对象:指针名->成员名
一维对象数组元素的访问:数组名[下标].成员名或(*(数组名+下标)).成员名
指针名[下标].成员名或(*(指针名+下标)).成员名每个对象都有一个指向自己的常数指针,即this指针。
在计算机中所有同类对象有不同的数据成员,但是只有共同的一组成员函数,成员函数靠this指针来识别是来自哪一个对象的调用。
同类对象可以相互赋值。
对象间赋值缺省是对应成员的赋值,成员中有指针时通常需要重载赋值号= 。
普通类型变量向对象赋值时会自动调用相应的构造函数建立一个隐藏的临时对象,再进行对象间赋值。
4、构造与析构函数
构造函数是在用类定义对象时对对象进行初始化的函数,在定义对象时自动被调用。
构造函数与类同名,无返回类型,可以有参数,可以重载,可以缺省参数。
析构函数是在对象撤消时自动被调用的,作用是用来清除对象动态申请的资源,析构函数与类同名,但前加一个~,无参数,不能重载。
构造函数和析构函数一般不能显式调用,构造函数在下面三种情况是例外:
对象数组初始化,在赋值号右边建立临时隐藏对象供对象赋值用,return 返回对象。
拷贝构造函数的参数是同类对象或同类对象的引用,缺省的拷贝构造函数是将样板对象的数据成员对应赋值给新建对象。
当数据成员中有指针时,一般需要编写自己的拷贝构造函数。
5、静态成员
静态成员是同类对象的公共成员,静态成员函数没有this指针,不能直接访问类的普通成员,只能访问静态成员,普通成员函数可以访问静态成员,任何一个对象改变了静态成员变量的值,将改变所有对象的该成员。
在类外对静态成员变量的初始化:
类型类::成员变量=初始值;
6、友元
友元就是让类外的函数或别的类访问私有区,友元不是该类的成员,它破坏封装。
友元有三种:
友元函数。
是类外的一般函数。
声明:friend 返回类型函数名(类形式参数,…… );
友元成员。
是其它类的成员函数。
声明:
friend 返回类型其它类名::函数名(类形式参数,…… );
友元类。
别的类。
声明:friend class 其它类名;友元可以在类的任何区声明,友元声明是单向的,没有传递性。
由于友元没有this指针,所以友元的形式参数是对象或对象的引用。
7、类的继承和访问权限
派生类继承了基类的成员,可以有公有派生和私有派生。
继承关系如下:
有的部分被舍弃,反之不能赋值。
8、多继承问题
一个类可以有多个基类,如果都是公有继承,在不同继承路径上继承的公共基类,由于在派生类中存在多个副本,会出现访问的二义性问题,要将这些副本合成一个,可以在派生时将这个基类声明为虚基类。
9、构造函数和析构函数的调用次序
在一个派生类中如果有对象成员,则基类、对象成员和派生类的构造次序如下:
先基类后对象成员最后派生类对象自身
析构的次序与构造次序相反。
构造函数和析构函数的调用次序与构造和析构次序相同。
构造函数的实现如下:
派生类名::构造函数名(参数表):基类1构造函数(参数),基类1构造函数(参数),……
对象成员1(构造参数表),对象成员2(构造参数表),……
{ 派生类对象的构造函数体
}
10、流与流类库
流运算符:<< 、>> 流类库:iostream、istream、ostream、ios,ios是istream、ostream的基类,istream和ostream又是iostream的基类,ios是抽象类。
使用流类库要在程序前加上:#include “iostream. h”
标准输出流:cout 是流向屏幕,它是一个ostre am类的对象。
标准输入流:cin 是由键盘流入,它是一个istream类的对象。
11、函数重载
重载是指一个符号可以有多重意义。
函数重载参看前面所述。
一般函数、普通成员函数、构造函数可以重载,析构函数不能重载。
12、操作符重载
对于对象与对象、对象与标准类型变量之间的运算,需要对运算符重载。
一般可以有成员函数重载和友元函数重载。
函数名:operator 运算符(参与运算的参数)
要注意++、--、<<、>> 运算符的重载,其中<<、>>运算符重载要流类(istream和ostream类)对象或引用作参数和返回值。
其中=、()、[]、->只能用成员函数重载。
将类类型转换成普通类型与运算符重载类似。
普通类型转换成类类型用构造函数实现。
13、多态性
分为静态的多态性和动态的多态性。
静态的多态性用重载实现。
动态的多态性是指:同一个消息发给不同对象,对象的反应不同。
它是在运行过程中进行连接的,所以由叫动态联编。
它的基础是虚函数。
14、虚函数与纯虚函数
虚函数的声明:virtual 返回类型函数名(参数表);
当用基类指针指向派生类对象时,通过这个指针调用虚函数将首先调用派生类中的实现,如果派生类中没有写这个函数的实现,则调用基类中的实现。
虚函数的虚特性可以传递。
如果派生类不写虚函数自己的实现,它又要在它的派生类中使用基类虚函数的虚特性,可以编写一个空的虚函数。
纯虚函数的声明:virtual 返回类型函数名(参数表)=0;
纯虚函数不需要写它的实现,含有纯虚函数的类叫抽象类,不能建立对象,可以作基类和定义指针。
在抽象类的派生类中要写出纯虚函数的实现,否则需要再次声明这个函数是虚函数,这样这个派生类也是抽象类。
虚函数实现了动态连接,但在构造和析构函数中调用虚函数时是静态连接,即没有虚特性。
15、模板
函数模板与模板函数,定义、实例化,模板函数的重载。
类模板与模板类,定义、实例化,类模板的派生。
一、单选题
第1题如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是( )
A、一元运算符
B、二元运算符
C、选项A)和选项B)都可能
D、重载错误
答案:D
第2题C++ 类体系中,不能被派生类继承的有()。
A、转换函数
B、构造函数
C、虚函数
D、静态成员函数
答案:B
第3题以下叙述中正确的是( )
A、构成C++语言程序的基本单位是类
B、可以在一个函数中定义另一个函数
C、main()函数必须放在其他函数之前
D、所有被调用的函数一定要在调用之前进行定义
答案:A
第4题设int a=10,b=11,c=12;,表达式(a+b)的值为( )
A、2
B、0
C、-2
D、1
答案:B
第5题下列关于构造函数说法不正确的是( )
A、构造函数必须与类同名
B、构造函数可以省略不写
C、构造函数必须有返回值
D、在构造函数中可以对类中的成员进行初始化答案:C 第6题设有数组定义:char array[]=”China";,则数组array所占的空间为( )
A、4个字节
B、5个字节
C、6个字节
D、7个字节
答案:C
第7题若已定义:int a[]={0,1,2,3,4,5,6,7,8,9},*P=a,i;其中O≤i≤9,则对a数组元素不正确的引用是( )
A、a[p-a]
B、*(& a[i])
C、p[i]
D、a[10]
答案:D
第8题如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是( )
A、一元运算符
B、二元运算符
C、选项A)和选项B)都可能
D、重载错误
答案:D
第9题表示在输出时显示小数位,和在文件输入时判断文件尾的函数分别是( )
A、showbase()和eof()
B、showpoint()和eof()
C、showpoint()和bad()
D、showpoint()和good()
答案:B
第10题
下面程序的运行结果为( ) 以下是引用片段:#include void main() { for(int a=0,x=0;!x&&a<= 10;a++) { a++; }
cout < < a ;}
A、10
B、11
C、12
D、0
答案:C。