}
4
#include
Usingnamespacestd;
main()
{
int*p;//声明一个整型指针变量p
//在下画线处,用new关键字动态分配一个int型存储区,并将首地址赋给p
p=newint;
*p=10;
cout<<*p;//在下画线处填上语句,用于撤销指针p,释放p指向的存储空间
deletep;
return0;
}
5
#include
main()
{
int*p;
//在画线处填上语句,用new关键字动态分配一个int型存储区,并将首地址赋给p
p=newint;
if(!
p)
{
cout<<"allocationfailure\n";
return1;
}
//在下画线处填上语句,将p所指向的存储区赋值20
*p=20;
cout<<*p;
//在下画线处填上语句,用于撤销指针p,释放p指向的存储空间
deletep;
return0;
}
6下列程序的输出结果是7。
#include
usingnamespacestd;
intmain()
{
inti=5;
int*p=&i;*p=7;
cout<
return0;
}
7下面是用来计算n的阶乘的递归函数,请将该函数的定义补充完整。
(注:
阶乘的定义是n!
=n*(n-1)*...*2*1)
unsignedfact(unsignedn)
{
if(n<=1)
return1;
returnn*fact(n-1);
}
8与成员访问表达式p->name等价的表达式是(*P).name。
9.UML的全称为UnifiedModelingLanguage,统一建模语言。
10.UML中有结构事物,动作事物,分组事物,注释事物四种类型事物。
11.UML中的四种关系为依赖,关联,泛化,实现。
12.类Sample的构造函数将形参data赋值给数据成员data。
请将类定义补充完整。
classSample{
public:
Sample(intdata=0);
Private:
Intdata;
};
Sample:
:
Sample(intdata){
【this->data=data;】
}
(13)若表达式(x+(y-z)*(m/n))+3中的变量均为double型,则表达式值的类型为【double】。
(14)有如下循环语句:
For(inti=50;i>20;i-=2) cout<
运行时循环体的执行次数是【15】。
(15)利用表达式a[i]可以访问int型数组a中下标为i的元素。
在执行了语句int*p=a;后,利用指针p也可访问该元素,相应的表达式是【*(p+i)】。
(16)下面是一个递归函数,其功能是使数组中的元素反序排列。
请将函数补充完整。
voidreverse(int*a,intsize){
if(size<2)return;
intk=a[0];
a[0]=a[size-1];
a[size-1]=k;
reverse(a+1, size-1);
}
(17)有如下类定义:
classSample{
public:
Sample();
~Sample();
Private:
Staticintdate;
};
将静态数据成员data初始化为0的语句是【intSample:
:
data=0;】
(18)“图形”类Shape中定义了纯虚函数CalArea(),“三角形”类Triangle继承了类Shape,请将Triangle类中的CalArea函数补充完整。
classShape{
public:
virtualintCalArea()=0;
}
classTriangle:
publicShape{
public:
Triangle{ints,inth}:
side(s),height(h){}
【intCalArea(intside,intheight)】{returnside*height/2;}
private:
intside;
intheight;
};
二.选择题
1建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数),这3种构造函数的调用顺序为()
AabcBacbCcabDcba
答案:
A
2下面描述中,符合结构化程序设计风格的是(A)
A)使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑
B)模块只有一个入口,可以有多个出口
C)注重提高程序的执行效率
D)不使用goto语句
3下面概念中,不属于面向对象方法的是(D)
A)对象B)继承C)类D)过程调用
4关于面向对象的程序设计方法,下列说法正确的是(D)
A)“封装性”指的是将不同类型的相关数据组合在一起,作为一个整体进行处理
B)“多态性”指的是对象的状态会根据运行时要求自动变化
C)基类的私有成员在派生类的对象中不可访问,也不占内存空间
D)在面向对象的程序设计中,结构化程序设计方法仍有着重要作用
5判断字符型变量ch是否为大写英文字母,应使用表达式(D)
A)ch>='A'&ch<='Z'B)ch<='A'||ch>='Z'
C)'A'<=ch<='Z'D)ch>='A'&&ch<='Z'
6已知下列语句中的x和y都是int型变量,其中错误的语句(C)
A)x=y++;B)x=++y;C)(x+y)++;D)++x=y;
7执行语句序列(D)
intn;
cin>>n;
switch(n)
{case1:
case2:
cout<<'1';
case3:
case4:
cout<<'2';break;
default:
cout<<'3';
}
时,若键盘输入1,则屏幕显示
A)1B)2C)3D)12
8关于动态存储分配,下列说法正确的是(B)
A)new和delete是C++语言中专门用于动态内存分配和释放的函数
B)动态分配的内存空间也可以被初始化
C)当系统内存不够时,会自动回收不再使用的内存单元,因此程序中不必用delete释放内存空间
D)当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new
9)对类的构造函数和析构函数描述正确的是(A)
A构造函数可以重载,析构函数不能重载
B构造函数不可以重载,析构函数可以重载
C构造函数可以重载,析构函数也可以重载
D构造函数不能重载,析构函数也不能重载
(10)下列程序的输出结果是(A)
#include
usingnamespacestd;
intmain()
{
chara[]="Hello,World";
char*ptr=a;
while(*ptr)
{
if(*ptr>='a'&&*ptr<='z')
cout<elsecout<<*ptr;
ptr++;
}
return0;
}
A)HELLO,WORLDB)Hello,World
C)hELLO,wORLDD)hello,world
11)已知:
intm=10;在下列定义引用的语句中,正确的是(A)
A)int&x=m;B)inty=&m;
C)int&z;D)int&t=&m;
(17)下列函数原型声明中错误的是(D)
A)voidFun(intx=0,inty=0);
B)voidFun(intx,inty);
C)voidFun(intx,inty=0);
D)voidFun(intx=0,inty);
(12)已知程序中已经定义了函数test,其原型是inttest(int,int,int);,则下列重载形式中正确的是(B)
A)chartest(int,int,int);
B)doubletest(int,int,double);
C)inttest(int,int,int=0);
D)floattest(int,int,float=3.5F);
(13)已知函数f的原型是:
voidf(int*a,long&b);变量v1、v2的定义是:
intv1;longv2;,正确的调用语句是(C)
A)f(v1,&v2);B)f(v1,v2);
C)f(&v1,v2);D)f(&v1,&v2);
(14)有以下类定义
classMyClass
{
public:
MyClass(){cout<<1;}
};
则执行语句MyClassa,b[2],*p[2];后,程序的输出结果是(B)
A)11B)111C)1111D)11111
(15)关于动态存储分配,下列说法正确的是(B)
A)new和delete是C++语言中专门用于动态内存分配和释放的函数
B)动态分配的内存空间也可以被初始化
C)当系统内存不够时,会自动回收不再使用的内存单元,因此程序中不必用delete释放内存空间
D)当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new
(16)关于友元,下列说法错误的是(A)
A)如果类A是类B的友元,那么类B也是类A的友元
B)如果函数fun()被说明为类A的友元,那么在fun()中可以访问类A的私有成员
C)友元关系不能被继承
D)如果类A是类B的友元,那么类A的所有成员函数都是类B的友元
(17)在公有派生的情况下,派生类中定义的成员函数只能访问原基类的(C)
A)公有成员和私有成员B)私有成员和保护成员
C)公有成员和保护成员D)私有成员、保护成员和公有成员
(18)在C++中用来实现运行时多态性的是(D)
A)重载函数B)析构函数C)构造函数D)虚函数
(19)一个类可以同时继承多个类,称为多继承。
下列关于多继承和虚基类的表述中,错误的是(C)
A)每个派生类的构造函数都要为虚基类构造函数提供实参
B)多继承时有可能出现对基类成员访问的二义性问题
C)使用虚基类可以解决二义性问题并实现运行时的多态性
D)建立最派生类对象时,虚基类的构造函数会首先被调用
(20)在一个类体的下列声明中,正确的纯虚函数声明是(A)
A)virtualvoidvf()=0;B)voidvf(int)=0;
C)virtualintvf(int);D)virtualvoidvf(int){}
(21)在下面的运算符重载函数的原型中,错误的是(A)
A)Volumeoperator-(double,double);
B)doubleVolume:
:
operator-(double);
C)VolumeVolume:
:
operator-(Volume);
D)Volumeoperator-(Volume,Volume);
(22)下列关于继承方式的描述中,错误的是(D)
A)如果不显式地指定继承方式,缺省的继承方式是私有(private)
B)采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员
C)采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员
D)采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员
(23)已知函数FA调用FB,若要把这两个函数定义在同一个文件中,则:
D
A)FA必须定义在FB之前
B)FB必须定义在FA之前
C)若FA定义在FB之后,则FA的原型必须出现在FB的定义之前
D)若FB定义在FA之后,则FB的原型必须出现在FA的定义之前
(24)有如下两个类定义
classAA{};
classBB{
AAv1,*v2;
BBv3;
int*v4;
};
其中有一个成员变量的定义是错误的,这个变量是:
C
A)v1 B)v2 C)v3 D)v4
(25)有如下类定义 (13)B:
classXX{
intxdata;
public:
XX(intn=0):
xdata(n){}
};
classYY:
publicXX{
intydata;
public:
YY(intm=0,intn=0):
XX(m),ydata(n){}
};
YY类的对象包含的数据成员的个数是
A)1 B)2 C)3 D)4
(26)下列有关运算符函数的描述中,错误的是:
C
A)运算符函数的名称总是以operator为前缀
B)运算符函数的参数可以是对象
C)运算符函数只能定义为类的成员函数
D)在表达式中使用重载的运算符相当于调用运算符重载函数
(27)下列字符串可以用作C++标识符的是:
D
A)2009var B)goto C)test-2009 D)_123
(28)下列枚举类型的定义中,包含枚举值3的是:
A
A)enumtest{RED,YELLOW,BLUE,BLACK};
B)enumtest{RED,YELLOW=4,BLUE,BLACK};
C)enumtest{RED=-1,YELLOW,BLUE,BLACK};
D)enumtest{RED,YELLOW=6,BLUE,BLACK};
(29)有如下程序段:
C
inti=1;
while
(1){
i++;
if(i==10)break;
if(i%2==0)cout<<'*';
}
执行这个程序段输出字符*的个数是
A)10 B)3 C)4 D)5
(30)已知数组arr的定义如下:
D
intarr[5]={1,2,3,4,5};
下列语句中输出结果不是2的是
A)cout<<*arr+1< C)cout<(31)计算斐波那契数列第n项的函数定义如下:
B
Intfib(intn){
if(n==0)return1;
elseif(n==1)return2;
elsereturnfib(n-1)+fib(n-2);
}
若执行函数调用表达式fib
(2),函数fib被调用的次数是
A)1 B)2 C)3 D)4
(32)Sample是一个类,执行下面语句后,调用Sample类的构造函数的次数是:
D
Samplea[2],*p=newSample;
A)0 B)1 C)2 D)3
(33)下列关于虚基类的描述中,错误的是:
C
A)使用虚基类可以消除由多继承产生的二义性
B)构造派生类对象时,虚基类的构造函数只被调用一次
C)声明“classB:
virtualpublicA”说明类B为虚基类
D)建立派生类对象时,首先调用虚基类的构造函数
(34)下列关于运算符重载的描述中,错误的是:
C
A):
:
运算符不能重载
B)类型转换运算符只能作为成员函数重载
C)将运算符作为非成员函数重载时必须定义为友元
D)重载[]运算符应完成“下标访问”操作
(35)有如下类定义 classA{
char*a;
public:
A():
a(0){}
A(char*aa){ //把aa所指字符串拷贝到a所指向的存储空间
a= A ;
strcpy(a,aa);
strcpy(a,aa);
}
~A(){delete[]a;}
};
横线处应填写的表达式是
A)newchar[strlen(aa)+1] B)char[strlen(aa)+1]
C)char[strlen(aa)] D)newchar[sizeof(aa)-1]
(36)将运算符重载为类成员函数时,其参数表中没有参数,说明该运算是:
(B)
A)不合法的运算符 B)一元运算符 C)无操作数的运算符 D)二元运算符(37)下列选项中不属于结构化程序设计原则的是:
A
A)可封装B)自顶向下C)模块化D)逐步求精
第一章概述
1-1简述计算机程序设计语言的发展历程。
解:
迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。
1-2面向对象的编程语言有哪些特点?
解:
面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。
面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。
通过类的继承与多态可以很方便地实