样题三
一.选择题 (2分×12)
1.下列字符列中,可作为C++语言程序自定义标识符是( B)。
A.switch B.student C.break D.do
2. 对数组名作函数的参数,下面描述正确的是( B )。
A.数组名作函数的参数,调用时将实参数组复制给形参数组
B.数组名作函数的参数,主调函数和被调函数共用一段存储单元
C.数组名作参数时,形参定义的数组长度不能省略
D.数组名作参数,不能改变主调函数中的数据
3.派生类的对象对它的基类成员中( A )是可以访问的。
A.公有继承的公有成员 B.公有继承的私有成员
C.公有继承的保护成员 D.私有继承的公有成员
4.若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则( B)不是对a数组元素的正确引用(其中0≤i<10)。
A.p[i] B.*(*(a+i)) C.a[p-a] D.*(&a[i])
5.若有以下定义,则释放指针所指内存空间的操作是 ( C )。
float r=news float[10];
A.delete r ; B.delete *r;
C.delete []r; D.delete r[];
6. 下面有关重载函数的说法中正确的是( C)
A. 重载函数必须具有不同的返回值类型;
B. 重载函数形参个数必须不同;
C. 重载函数必须有不同的形参列表
D. 重载函数名可以不同;
7.在if语句中的表达式是( )。
A.只能是表达式 B.只能是关系表达式和逻辑表达式
C.只能是逻辑表达式 D.可以是任意表达式
8.下面描述中,表达错误的是(B )
A. 公有继承时基类中的public成员在派生类中仍是public的
B. 公有继承是基类中的private成员在派生类中仍是private的
C. 公有继承时基类中的protected成员在派生类中仍是protected的
D. 私有继承时基类中的public成员在派生类中是private的
9.下列关于构造函数的描述中,错误的是( D )
A. 构造函数可以设置默认参数; B. 构造函数在定义类对象时自动执行
C. 构造函数可以是内联函数; D. 构造函数不可以重载
10. 下面对于友元函数描述正确的是 ( C )
A. 友元函数的实现必须在类的内部定义 B. 友元函数是类的成员
C.友元函数破坏了类的封装性和隐藏性 D.友元函数不能访问类的私有成员
11. 在用关键字class定义的类中,以下叙述正确的是( A )。
A. 在类中,不作特别说明的数据成员均为私有类型
B. 在类中,不作特别说明的数据成员均为公有类型
C. 类成员的定义必须是成员变量定义在前,成员函数定义在后
D. 类的成员定义必须放在类定义体内部
12. C++语言的跳转语句中,对于break和continue说法正确
的是( B )
A. break语句只应用与循环体中
B. continue语句只应用与循环体中
C. break是无条件跳转语句,continue不是
D. break和continue的跳转范围不够明确,容易产生问题
13. 运算符 +、<=、=、% 中,优先级最低的运算符是( )。
A. + B.< C.= D.%
14. 设变量m,n,a,b,c,d的值均为0,执行(m = a==b)||(n=c==d)后,m,n的值是( )。
A.0,0 B. 0,1 C. 1,0 D. 1,1
15.若有以下定义,则对字符串的操作错误的是( )。
char s[10]=”Program”,t[]=”test”;
A. strcpy(s,t); B. cout<<strlen(s);
C. strcat(“this”,t); D. cin>>t;
16.设有代码“int a = 6;”,则执行了语句“a + = a - = a*a;”后,变量a的值是( )。
A.0 B. -24 C. -40 D. –60
17. void main()
{ int x=-1;
do
{x=x*x;}
while(!x);}
下列说法正确的是( )。
A.是死循环 B.循环执行两次
C.循环执行一次 D.有语法错误
17.下面有关for循环的正确描述是( )。
A.for循环只能用于循环次数已经确定的情况
B.for循环是先执行循环体语句,后判断表达式
C.在for循环中,不能用break语句跳出循环体
D.for循环的循环体语句中,可以包含多条语句,但必须用大括号括起来
18.下面程序段( )。
x=3;
do
{y=x--;
if(!y) {cout<<”x”; continue;}
cout<<”#”;}
while(1<=x && x<=2);
A.将输出### B.将输出##*
C.是死循环 D.含有不合法的控制表达式
19.以下正确的说法是( )。
A.用户若需要调用标准函数,调用前必须重新定义
B.用户可以直接调用所有标准库函数
C.用户可以定义和标准库函数重名的函数,但是在使用时调用的是系统库函数
D.用户可以通过文件包含命令将系统库函数包含到用户源文件中,然后调用系统库函数
20.在参数传递过程中,对形参和实参的要求是( )。
A.函数定义时,形参一直占用存储空间
B.实参可以是常量、变量或表达式
C.形参可以是常量、变量或表达式
D.形参和实参类型和个数都可以不同
21. 以下程序的输出结果是( )。
#include <iostream.h>
void main()
{ char s[]="12134211",*p;
int v1=0,v2=0,v3=0,v4=0;
for (p=s;*p;p++)
switch(*p)
{
case '1':v1++;
case '3':v3++;
case '2':v2++;
default: v4++;
}
cout<<v1<<","<<v2<<","<<v3<<","<<v4<<endl;
}
A.4,2,1,1 B.4,7,5,8 C.7,3,2,1 D.8,8,8,8
22. 对类的构造函数和析构函数描述正确的是( )。
A.
构造函数可以重载,析构函数不能重载
B.构造函数不能重载,析构函数可以重载
C.构造函数可以重载,析构函数也可以重载
D.构造函数不能重载,析构函数也不能重载
23. C++类体系中,不能被派生类继承的有( )。
A.构造函数 B.虚函数 C.静态成员函数 D.赋值操作函数
24.以下( )成员函数表示虚函数。
A.virtual int vf(int); B.void vf(int)=0;
C.virtual void vf()=0; D.virtual void vf(int) { };
25. 下面对静态数据成员的描述中,正确的是( )。
A.静态数据成员可以在类体内进行初始化
B.静态数据成员不可以在类体内进行初始化
C.静态数据成员不能受private控制符的作用
D.静态数据成员可以直接用类名调用
26. 继承具有( ),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A.规律性 B.传递性 C.重复性 D.多样性
二. 填空题(2分×13)
1.当一个成员函数被调用时,该成员函数的 this指针 指向调用它的对象。
2. 拷贝构造函数使用引用(已经存在的对象)作为参数初始化创建中的对象。
3. 设"int a=3,b=4,c=5;",表达式"(a+b)>c&&b==c"的值是 0 。
4. 动态联编要满足两个条件,它们是 被调用的成员函数是虚函数、 用指针或者引用调用虚函数 。
5. 含有纯虚函数的类称为 抽象类 。
6. 已知intDBL(int n){return n + n;}和longDBL(long n){return n +n;}是一个函数模板的两个实例,则该函数模板的定义是 template <typename T> DBL(T n){return n+n;} 。
7. 用new申请某一个类的动态对象数组时,在该类中必须能够匹配到 无参或缺省参数的 构造函数,否则应用程序会产生一个编译错误。
8. 在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。对两个有相同名字的数据成员进行访问时,如果没有 类作用域符 ,对此数据成员的访问将出现歧义。
9.设有代码“static int a[3][4]={{1,2}, {3}, {4,5,6}};”则a[1][1]值为 。
10. 在公有继承的情况下,基类数据成员在派生类中的访问权限 不变 。
11. 构造函数的功能 完成对象的初始化 。
12. 类和对象的关系和__数据类型_与变量的关系相似。
13. 若指针 P 所指向的对象的值为10,P+1 所指向的对象的值为20,则*++P的值为___20____。
13.C++程序有且只有一个 。
14.若有变量定义 int x = 7; float a = 2.5, c = 4.7;表达式
a + (int)(x/3*(int)(c + 2)/2) % 4 值是 。
15.”x或y中至少有一个小于z”的C++语言表达式是 。
16.将字符串s2拷贝到字符数组s1的函数调用是 。
17.执行语句“ x = (
a = 4, b = a++);”后,变量x、a、b的值依次为 。
18.表述“x或y中有一个大于z”的C++语言表达式是 。
19.执行语句“ y = (x = 3, z = --x);”后,变量的值依次为_ 。
20.设 #define a(x) x*x;
cout<<a(4+6)<<endl;
上述程序段运行结果为 。
21.设x为整型变量,表达数学关系式:13 < x < 19的C++语言表达式是 。
指向类成员函数的指针22.若有定义:char u; int b; float v; double d;
则表达式u * b + d - v的值的类型为 。
24.假定所有变量均已正确定义,下列程序段运行后x的值是 。
a = b = c = 0; x = 35;
if(!a)x--;else if(b);if(c)x = 3;else x = 4;
26.C++将类继承分为 和 两种。
27.派生类可以定义其_ _____中不具备的数据和操作。
28.operator是C++的一个关键字,它经常和C++的一个运算符连用,构成一个运算符函数名。运算符函数的返回类型不能是 类型。
29.在继承机制下,当对象消亡时,编译系统先执行 _ _____的析构函数,然后再执行 __ ____的析构函数。
30.C++文件的两种类型,分别是 和 。
三.简答题(10分×2)
1.若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?(10分)
缺省拷贝函数的行为是逐字节拷贝,因此会将引用的对象的内容原封不动的拷贝给新对象,因此如果该对象中含有动态分配的内存时,这种拷贝行为只会将指针的内容(地址)拷贝给新对象而不会为新对象的指针重新分配内存,因此会产生两个指针指向同一个内存,释放内存时会使该内存释放两次,导致程序错误。
2.简述成员函数、全局函数和友元函数的差别。(10分)
成员函数是类的内部函数,它可以访问类中的其它数据成员和函数成员,并可以调用像全局函数这样的自由函数,它必须通过对象来调用(静态成员函数除外);
全局函数是自由函数,它不需要通过对象来调用,可以像C语言中的函数一样直接调用,它不能直接访问类的数据成员和函数成员,而必须通过对象访问类中的访问控制方式为公有的数据成员和函数成员;
友元函数不属于该类,因此它没有该类的this指针,它可以由其它类的成员函数充当或者由自由函数充当。
3.简述结构化的程序设计、面向对象的程序设计的基本思想。
要点:结构化程序设计是面向过程的,即把数据与方法区分。面向对象的程序设计是面向对象的,将事物的方法和行为封装在一起。
4.结构struct和类class有什么异同?
要点:无严格意义上的差别,只是结构体默认的成员访问控制方式为公有,
而类默认的访问控制方式为私有
四.程序填空。(5分×4)
1. 下面程序的运行结果是_ BCCAD~D~A~C~C~B _
#include <iostream.h>
class A { public: A(int i) { cout << “A”;}
~A() {cout<<“~A” ; }};
class B { public: B(int i) { cout << “B”;}
~B() {cout<<“~B” ; }};
class C { public: C(int i) { cout << “C”;}
~C() {cout<<“~C” ;} };
class D : public B
{
public:
C c1, c2;
A a;
D( ) : c1(1), c2(2), a(3), B(2)
{ cout << “D”;}
~D()
{cout<<“~D”; }
};
void main()
{
D d;
return ;
}
2.下面程序的运行结果是_ 7,6(换行)6,6 _
#include <iostream.h>
int X = 36;
int & f(int & i, int j);
void main()
{
int i = X / 10, j = X % 10;
++ f(i, j);
cout << i << ", " << j << endl;
f(i, j)--;
cout<< i << ", " << j << endl;
return ;
}
int & f(int & i, int j)
{
int t = j;
j = i;
i = t;
return i > j ? i: j;
}
3. 下面程序的运行结果是_ df, dvf, bf, dvf, bf, dvf
#include <iostream.h>
class B
{
public:
void f() { cout << "bf, "; };
virtual void vf() { cout << "bvf, "; };
void ff() { f(); vf(); };
virtual void vff() { f(); vf(); };
};
class D: public B
{
public:
void f() { cout << "df, "; };
void vf() { cout << "dvf, "; };
};
void main()
{
D d, * pD = &d;
pD->f();
pD->vf();
pD->ff();
pD->vff();
return ;
}
4. 下面程序的运行结果是_ abac _
#include <iostream.h>
class CTest
{
public:
CTest(){ cout << "a"; };
CTest(CTest & oTest){ cout << "b"; };
operator = (CTest & oTest)
{ cout << "c"; }
};
void main()
{
CTest o1, o2 = o1, o3;
o3 = o1;
return ;
}
5. 下面程序的运行结果是_ _
#include <iostream.h>
class CCounter
{
private:
static int iCount;
public:
CCounter() { iCount += (iCount % 5); };
~CCounter(){ iCount -= (iCount % 4 + 1); };
static void Reset(){ iCount = 41 % 18; };
static int GetCount() {return iCount; };
};
int CCounter::iCount;
typedef CCounter * CCounterPtr;
void f(CCounterPtr & pCounter);
void main(void)
{
CCounter::Reset();
CCounter aCount;
CCounterPtr p;
f(p);
cout << aCount.GetCount() << ", ";
CCounter * pCounter = p;
cout << p->GetCount() << ", ";
p->Reset();
cout << (pCounter + 2)->GetCount() << ", ";
delete[] p;
cout << CCounter::GetCount() <<endl;
return ;
}
void f(CCounterPtr & pCounter)
{
cout << CCounter::GetCount() << ", ";
pCounter = new CCounter[10];
return ;
}
6. 下面程序的运行结果是_ _
#include <iostream.h>
int & f(int & i, int j);
int & g(int i, int & j);
void main(void)
{
int i = x / 10, j = x % 10;
++ f(i, g(i, j));
cout<< i << ", " << j <<endl;
g(i, f(i, j)) --;
cout << i << ", " << j <<endl;
return;
}
int & f(int & i, int j)
{
int t = j;
j = i;
i = t;
return i>j ? i : j;
}
in
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论