目录
第五章 数组
第六章 指针
第七章 自定义数据类型
第八章 类和对象
一、选择题
1. 若有定义:char a[]="xyz", b[]={'x', 'y', 'z'};,则在下列叙述中正确的是( )
A. 数组a和b的长度相同 B. 数组a的长度小于数组b的长度
C. 数组a的长度大于数组b的长度 D. 数组b以'\0'结束,而a不是
2. 若有定义:int b[][3]={{1},{3,2},{4,5,6}},{0}};,则b[2][2]的值是( )
A. 0 B. 2 C. 5 D. 6
3. 给字符数组进行初始化的选项中,正确的是( )
A. char s1[ ]="12345abcd"; B. char s2[3]="xyz";
C. char s3[][3]={ 'a', 'x', 'y'}; D. char s4[2[3]={"xyz","mnp"};
4. 关于数组的说法中,不正确的是( )
A. 数组是数据的集合
B. 数组是有类型属性的
C. C++不允许动态改变数组的大小
D. 不能一次引用整个数组中的全部元素值
5. 将两个字符串连接起来组成一个字符串的函数是( )
A. strlen B. strcpy C. strcat D. strcmp
6. 关于C++语言的数组的描述中,正确的是( )
A. 数组的名字就是指向该数组第一个元素的指针
B. 长度为n的数组,下标的范围是1~n
C. 数组的大小在运行时确定
D. 数组只能通过值参数和引用参数两种方式传递给函数
一、选择题
1. 下列关于函数参数的描述中错误的( )
A. 函数的形参在定义时不占用内存的存储单元
B. 在函数的传值调用中将用实参来初始化形参
C. 在函数的传址调用中形参不需要分配存储空间
D. 在函数的传引用调用中形参是实参的别名
2. 关于函数的说法中,错误的是( )
A. 函数名代表函数的入口地址
B. 函数指针就是返回指针值的函数
C. 函数指针可以作为另一个函数的参数
D. 在32位系统中,函数指针变量的存储空间是4个字节
3. 关于指针运算的说法中,不正确的是( )
A. 两个指针在一定条件下可以进行相等或不等的运算
B. 可以用空指针赋值给指针变量
C. 一个指针可以加上两个整数之差
D. 两个指针在一定条件下可以相加
4. 已知:const char *p=”abc”;,则下列语句合法的是( )
A. p[2]=’k’; B. *p[2]=’k’; C. *p=”xyz”; D. p=”xyz”;
5. 若有语句:char* p=new char[30];,则释放p所指向的动态内存应使用的语句是( )
A. delete p; B. delete *p; C. delete &p; D. delete[] p;
6. 若有变量定义:int x=5;,则将rx定义为变量x的引用的是( )
A. int rx=x; B. int rx=&x; C. int *rx=&x; D. int &rx=x;
7. 传递引用调用方式起着( )的作用。
A. 传值调用C. 在函数的传址调用中形参不需要分配存储空间
B. 函数指针就是返回指针值的函数
D. 两个指针在一定条件下可以相加
8. 关于引用的叙述中,不正确的是( )
A. 每一个引用都是其所引用对象的别名,因此必须初始化
B. 形式上针对引用的操作实际上作用于它所引用的对象
C. 一旦定义了引用,一切针对其所引用对象的操作只能通过该引用间接进行
D. 不需要单独为引用分配存储空间
9. 若有定义:int a[5],*p=a;,则不合法的表达式是( )
A. p=p+1 B. a=a+1 C. p-a D. a+2
10.关于delete的描述中,正确的是( )
A. delete是函数
B. 它必须用于new返回的指针
C. 对一个指针可以连续使用多次delete
D. delete[]只能删除一维的动态数组
11.引用调用的调用方式是指( )
A. 形参和实参都是变量 B. 形参是指针,实参是地址值
C. 形参是引用,实参是变量 D. 形参是变量,实参是地址值
12. 下面程序段的运行结果是( )
char a[]="abcdefgh";
char *p=a;
p+=3;
cout< A. 4 B. 8 C. 9 D. 12 13. 若有定义: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p=&a[0][0]; 下列选项中的表达式能表示a[2][2]的是( ) A. p[2][2] B. *(*(p+2)+2) C. *(p+10) D. *(p+8) 14. 若有定义:int *p=new int;,则下列说法中不正确的是( ) A. 声明了一个指向整型变量的指针p B. 可以用*p来表示所指向的整型变量 C. 通过运算符new,分配了一个整型数据的空间,并将其起始地址赋给指针p D. 系统为指针变量p分配了一个整型数据的存储空间 15. 定义函数指针的是( ) A. int *p( ); B. int (*p)( ); C. (int *) p( ); D. (int *p)( ); 16. 在int a=5, *p=&a;中,*p的值是( ) A. 变量a的地址 B. 无意义 C. 变量p的地址 D. 5 17. 在int a=5, *p=&a;中,p的值是( ) A. 变量a的地址 B. 无意义 C. 变量p的地址 D. 5 18. 已知:int a[3][7];,下列格式中不表示数组元素的是( ) A. *(a+1)[5] B. *(*a+3) C. *(*(a+1)) D. *(&a[0][0]+2) 19. const char *ptr;语句的含义是( ) A. 定义指向字符常量的指针 B. 定义指向字符的常量指针 C. 定义指向字符串常量的指针 D. 定义指向字符串的常量指针 20. char * const ptr;语句的含义是( ) A. 定义指向字符常量的指针 B. 定义指向字符的常量指针 C. 定义指向字符串常量的指针 D. 定义指向字符串的常量指针 21. 对下面语句的描述中,正确的是( ) const int* x; //(1) int* const x; //(2) const int* const x; //(3) A. 语句(1)的含义是指针变量x不能更改 B. 语句(2)的含义是指针变量x所指向的值不能更改 C. 语句(3)的含义是指针变量x及其所指向的值均不能更改 D. 语句(1)和语句(2)是相同含义的不同定义方式 22. 定义数组指针的是( ) A. int *p[5]; B. int (*p)[5]; C. (int *)p[5]; D. int *p[]; 23. 下列关于delete运算符的描述中,错误的是( ) A. 它必须用于new返回的指针 B. 它也适用于空指针 C. 对一个指针可以使用多次该运算符 D. 指针名前只用一对方括号符,不管删除数组的维数 24. 下列说法正确的是( ) A. 数组的下标表示法处理速度比指针表示法处理速度慢 B. 数组的下标表示法处理速度比指针表示法处理速度快 C. 数组的下标表示法处理速度和指针表示法处理速度相同 D. 数组的下标表示法处理速度和指针表示法处理速度不可比较 25. 已知:char * const p=”abc”;,则下列语句合法的是( ) A. p[2]=’k’; B. *p[2]=’k’; C. *p=”xyz”; D. p=”xyz”; 26. 下列表示中,函数指针的引用格式是( ) A. (*p)(5) B. *p[5] C. *p(5) D. (*p)[5] 27. 对于int *pa[5];的下列描述中正确的是( ) A. pa是一个指向数组的指针,所指向的数组是5个int型元素 B. pa是一个指向某数组中第5个元素的指针,该元素是int型变量 C. pa[5]表示某个数组的第5个元素的值 D. pa是一个具有5个元素的指针数组,每个元素是一个int型指针 28. 下列语句错误的是( ) A. char *p=”John”; p[2]=’a’; B. char name[5]=”John”; name[2]=’a’; C. char name[5]=”John”, *p=name; p[2]=’a’; D. char name[5]=”John”, *p=&name[2]; *p=’a’; 29. 有如下定义语句:int a[]={1,2,3,4,5};,则对语句int *p=a;正确的描述是( ) A. 语句int *p=a;定义不正确 B. 语句int *p=a;初始化变量p,使其指向数组对象a的第一个元素 C. 语句int *p=a;是把a[0]的值赋给变量p D. 语句int *p=a;是把a[1]的值赋给变量p 30. 若0≤i<5,则对如下语句定义中,对数组元素表示错误的是( ) int a[]={1, 2, 3, 4, 5}, *p, i; p=a; A. *(a+i) B. a[p-a] C. p+i D. *(&a[i]) 31. 已知:int m=10; ,则下列表示引用的方法中正确的是( ) A. int &x=m; B. int &y=10; C. int &z; D. float &t=&m; 32. 若有定义: int x[5], *p=a; 则p的值为( ) A. 5 B. 数组x的首地址 C. 数组x的首元素 D. 无具体值 33. 下列关于指针的说法中正确的是( ) A. 不可以将一个数组名赋给一个指针 B. 在使用一个指针之前,必须先赋初始值 C. 指针类型和它所指向的变量的类型不一样 D. 指针类型与它所指向的变量的类型可相同可不相同 34. void类型主要用于说明( ) A. 常量和指针 B. 函数和变量 C. 函数和指针 D. 常量和变量 35. 下列关于数组作为函数参数的说法中不正确的是( ) A. 数组名作函数参数时向函数传递的是数组的首地址 B. 数组作函数参数时对实参数组的元素数没有限制 C. 被调用函数中对形参数组元素值的改变将被带回到实参数组中 D. 实参用数组时,被调用函数的形参可以用相应类型的指针 36. 设有说明语句:char *s[]={"Student","Teacher","Father","Mother"}, *ps=s[2]; 则执行语句:cout<<*s[1]<<','< 时的输出结果为( ) A. T,Father,F B. Teacher,F,Father C. Teacher,Father,Father D. 语法错误无输出 二、填空题 1. 假设p是一个指针,则a=*p++的运算过程是:首先进行a=*p的赋值操作(或a=*p) , 然后再进行指针的p加1操作(或p++)。 2. 若程序中有说明语句:int (*p)(void);,则p的含义是:指向无参数、返回值为int型的函数的指针 。 3. 若程序中有说明语句:int *p(void);,则p的含义是:无参数、返回值为int型的函数名 。 4. 若程序中有说明语句:int (*p)[3];,则p的含义是:指向第二维有3个元素的、int型数组的指针 。 5. 若程序中有说明语句:int *p[3];,则p的含义是:具有三个元素、每个元素是一个int型指针的一维数组名 。 6. 若指针p所指向的对象的值为10,p+1所指向的对象的值为20,则*++p的值为20。 7. 定义为void类型的指针变量可以被赋给指向 任何类型 的指针。 8. 若有如下定义语句: int a(5); //(1) int &b=a; //(2) int *p=&a; //(3) 则(2)和(3)两句中的&符号的含义分别是 引用定义 和 取地址运算 。 9. 说明为void类型的指针可以被赋给指向 任何类型 的指针。 10. 假定p为指向一维数组b[10]中元素b[5]的指针,则p+4所指向的元素为 b[9]。 11. 假定p所指对象的值为25,p+1所指对象的值为46,则执行“(*p)++;”语句后,p所指对象 的值为 26。 一、选择题 1. 下列选项中不是用于自定义数据类型关键字的是( ) A. define B. typedef C. enum D. struct 2. 若有定义语句:enum color{blue, white, red, black}; enum color cc; 则下列选项中不正确的是( ) A. cc=blue; B. cc=enum color(0); C. cc=(enum color)0; D. cc=0; 3. 若有定义语句:enum color{blue, white, red, black}; enum color cc=red; 则执行语句:cout< 时输出的结果为( ) A. 1 B. 2 C. 3 D. red 4. C++语言中用自定义类型定义变量时,( ) A. 不能使用类型关键字 B. 可以不用类型关键字 C. 必须进行进行初始化 D. 不能进行初始化 5. 设有如下枚举类型定义:enum color {red=3, yellow, blue=10, white, black};,其中枚举量black的 值是( ) A. 7 B. 15 C. 12 D. 14 6. 有如下定义语句:typedef char* PCHAR;,下列语句正确的是( ) A. 语句:PCHAR P;定义了一个字符变量 B. PCHAR p=’a’; C. PCHAR p; char name[5]=”John”; p=name; D. PCHAR p=”Hello”; cout<
7. 若定义枚举类型:enum Number{one=1, two=2, four=4, eight=8};,正确的选项是( ) A. Number num=1; B. Number num=Number(20); C. Number num=Number(eight|0xFF); D. 枚举类型Number的取值范围是0~15 8. 如定义枚举类型:enum Day{Monday, Tuesday, Wednesday, Thursday, Friday=2};,则下列选项正确 的是( ) A. 表达式Wednesday==Friday的值是1 B. Day day; day=3; C. Day day; day=Monday+3; D. Day day; day=Wednesday-Monday; 9. 下列关于枚举类型的说法中正确的是( ) A. 可以直接给枚举变量赋相应的整数值 B. 若有一个枚举常量标识符被初始化为字符值,则其它枚举常量标识符也必须全部初始化为 字符值 C. 枚举变量不能参与算术运算 D. 枚举常量列表中默认的第一个常量标识符的初始化值为1 10. 已知公用体变量data1的定义如下: union data { int i; char ch; float f; } data1; 则变量data1所占的内存存储空间大小可表示为( ) A. sizeof(int) B. sizeof(char) C. sizeof(float) D. sizeof(int)+sizeof(char)+sizeof(float) 二、填空题 1. 枚举变量的取值范围局限于定义该枚举变量的枚举类型的 枚举标识符。 2.若有如下语句: typedef char* string; typedef string months[3]; 则系统中定义的新类型名分别是 string 和 months 。 一、选择题 1. 下列特性中,C与C++共有的是( ) A. 继承 B. 封装 C. 多态性 D. 函数定义不能嵌套 2. 一般情况下,将( )函数说明为内联函数。 A. 函数的代码量小,调用次数少 B. 函数的代码量小,调用次数多 C. 函数的代码量大,调用次数少 D. 函数的代码量大,调用次数多 3. 不能作为函数重载判断依据的是( ) A. 返回类型 B. const C. 参数个数 D. 参数类型 4. 下列说法中正确的是( ) A. 在函数参数定义中可以使用const说明符,其值在函数体内不可改变 B. 在函数参数定义中可以使用const说明符,但必须指定缺省值 C. 在函数参数定义中可以使用const说明符,但只能有一个参数使用const D. 在函数参数定义中不可以使用const说明符 5. 已知函数float fun(float)是类A的成员函数,fp是指向该函数类型的指针,但fp不是类A的成 员,则下列操作正确的是( ) A. fp=fun; B. fp=fp(3.5); C. fp=A::fun; D. p=A::fun(3.5); 6. f()函数是类的一个常成员函数,它有一个int型参数,并且返回类型为int。下列对该常成员函 数进行声明的选项中,正确的是( ) A. int f(int)const; B. const int f(int); C. int f(const int); D. const int f(const int); 7. C++提供的可有效分配对象空间的运算符是( ) A. delete B. new C. pos D. auto 8. 下面关于new运算符的描述中错误的是( ) A. 使用new创建对象时必须定义初始值 B. 使用new创建对象时会调用类的构造函数 C. new可以用来动态创建对象和对象数组 D. 使用new创建的对象可以使用delete删除 9. 关于new的描述中,正确的是( ) A. new是分配内存空间的函数 B. new可以分配对象空间 C. new分配的内存空间可用free撤销 D. new分配数组的同时可对数组初始化 10. 在C++中用类将数据和对数据操作的代码连接在一起称为( ) A. 软件重用 B. 封装 C. 集合 D. 多态 11不属于类的成员函数的是( ) A. 构造函数 B. 析构函数 C. 友元函数 D. 复制构造函数 12. 在面向对象的程序设计中,首先需要在问题域中识别出若干个( ) A. 函数 B. 类 C. 文件 D. 过程 13. 假设MyClass是一个类,则该类的拷贝初始化构造函数的声明语句为( ) A. MyClass&(MyClass x); B. MyClass(MyClass x); C. MyClass(MyClass &x); D. MyClass(MyClass *x); 14. 对于C++结构中定义的成员,其隐含的访问权限为( ) A. public B. protected C. private D. static 15. 为类提供对外接口的是( ) A. 公有成员函数 B. 私有成员函数 C. 保护成员函数 D. 友元函数 16. 对于任意一个类,析构函数的个数最多为( ) A. 0 B. 1 C. 2 D. 3 17. 若类A的构造函数定义为 A(int aa=1, int bb=0) { a = aa; b = bb; } 则执行:A x(4);后,x.a和x.b的值分别是( ) A. 1,0 B. 1,4 C. 4,0 D. 4,1 18. 若类A被说明成类B的友元,则( ) A. 类A的成员即类B的成员 B. 类B的成员即类A的成员 C. 类A的成员函数不能访问类B的成员 D. 类B不一定是类A的友元 19. 已知类A中的一个成员函数说明为void fun(A &a);,则A &a的含义是( ) A. 将a的地址值赋给变量fun B. 指向类A的指针为a C. a是类A的对象引用,用来做函数fun()的形参 D. 变量A与a按位相与运算后作为函数fun()的参数 20. 友元的作用是( ) A. 提高成员的运行效率 B. 加强类的封装性 C. 实现数据的隐藏性 D. 增加成员函数的种类 21. 析构函数的特征是( ) A. 类只能定义一个析构函数 B. 析构函数名与类名不同 C. 析构函数的定义只能在类体内 D. 析构函数可以有一个或多个参数 22. 不能作为类成员的是( ) A. 自身类对象的指针 B. 自身类的对象 C. 自身类对象的引用 D. 另一个类的对象 23. 通常的拷贝初始化构造函数的参数是( ) A. 对象名 B. 对象的成员名 C. 对象的引用名 D. 对象的指针名 24. 不是构造函数特征的是( ) A. 构造函数的函数名与类名相同 B. 构造函数可以重载 C. 构造函数可以设置默认参数 D. 构造函数必须指定类型说明 25. 属于类的内部实现的是( ) A. 公有成员 B. 私有成员 C. 保护成员 D. 友元 26. 关于成员函数特征的下述描述中错误的是( ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 27. 下列关于静态数据成员的特性描述中错误的是( ) A. 说明静态数据成员时前边要加static B. 静态数据成员要在类体外进行初始化 C. 引用静态数据成员时,要在静态数据成员名前加“类名”和作用域运算符 D. 静态数据成员不是所有对象所共用的 28. 关于具有转换函数功能的构造函数说法中正确的是( ) A. 不带参数的构造函数 B. 带有一个参数的构造函数 C. 至少带有二个参数的构造函数 D. 缺省构造函数 29. 对重载函数的描述中,错误的是( ) A. 重载函数中不允许使用缺省参数 B. 重载函数中编译系统根据参数表进行选择 C. 不要使用重载函数来描述毫无相干的函数 D. 构造函数重载将会给初始化带来多种方式 30. 在面向对象的程序中,不属于对象特点的是( ) A. 多态性 B. 抽象性 C. 封装性 D. 继承性 31. 在C++中,类是一种( ) A. 自定义函数 B. 头文件 C. 自定义数据类型 D. 控制结构 32. C++类成员的缺省访问属性是( ) A. protected B. private C. public D. friend 33. 面向对象程序设计将数据和( )放在一起,作为一个相互依存、不可分割的整体来处理。 A. 对数据的操作 B. 信息 C. 数据隐藏 D. 数据抽象 34. 面向对象程序设计优于传统的结构化程序设计,其优越性主要表现在,它有希望解决软件工 程的两个主要问题:软件复杂性控制和( ) A. 软件生产率的提高 B. 精化已有的代码 C. 共享代码 D. 编写可重用代码 35. 面向对象系统的( )是一种信息隐藏技术,目的在于将对象的使用者和设计者分开,使 用者不必知道对象行为实现的细节,只需要设计者提供的协议命令对象去做即可。 A. 多态性 B. 封装性 C. 继承性 D. 复用性 36. 类模板的使用实际上是将类模板实例化成一个具体的( ) A. 类 B. 对象 C. 函数 D. 模板类 37. 模板是实现类属机制的一种工具,其功能非常强大,它允许用户构造类属函数,这种类属函 数也称为( ) A. 模板函数 B. 函数模板 C. 模板类 D. 类模板 38. 一个( )允许用户为类定义一种模式,使得类中的某些数据成员及某些成员函数的返回 值能取任意类型。 A. 函数模板 B. 模板函数 C. 类模板 D. 模板类 39. 假设MyClass为一个类,则执行MyClass a, b(2),*p;语句时,自动调用该类的构造函数( ) 次。 A. 2 B. 3 C. 4 D. 5 40. 在C++语言中,数据封装要解决的问题是( ) A. 数据的规范化 B. 便于数据转换 C. 避免数据丢失 D. 防止不同模块之间数据的非法访问 41. 类中数据成员的生存期( ) A. 由对象的生存期决定 B. 比对象的生存期长 C. 比对象的生存期短 D. 与对象的生存期无关 42. 形如X::X(const X& x)的函数被称为( ) A. 析构函数 B. 复制构造函数 C构造函数. D. 友元函数 43. 类的指针数据成员的初始化是通过函数完成的,这个函数通常是( ) A. 析构函数 B. 构造函数 C. 友元函数 D. 其它成员函数 44. 关于友元的描述中,正确的是( ) A. 友元函数是成员函数的一种,它可以访问类的私有成员 B. 友元函数不能提高程序的运行效率 C. 友元函数要在类体内说明 D. 友元函数增强了类的封装性和隐藏性 45. 在类定义中,三种访问限定符出现的次数为( ) A. 至少一次 B. public至少一次 C. 至多一次 D. 任意多次 46. 在C++中实现封装主要是借助于( ) A. 枚举 B. 类 C. 数组 D. 函数 47. 关于析构函数的描述中,正确的是( ) A. 析构函数的函数类型是void B. 析构函数名与类名不同 C. 析构函数不能有参数 D. 析构函数用于撤销对象 48. 关于类的说法中,错误的是( ) A. 类是一种用户自定义的数据类型 B. 只有类中的成员函数才能访问该类的私有函数 C. 在类中,如果不作特殊说明,所有的成员数据均为私有类型 D. 在类中,如果不作特殊说明,所有的成员函数均为公用类型 49. 关于模板的描述中,不正确的是( ) A. 函数模板和类模板的参数可以是任意的数据类型 B. 类模板不能直接使用,必须先实例化为相应的模板类,然后定义了模板类的对象后才能使 用 C. 函数模板不能直接使用,需要实例化为模板函数才能使用 D. 类模板的成员函数都是模板函数 50. 关于类的析构函数在何时被调用的说法中,正确的是( ) A. 创建类时 B. 创建对象时 C. 删除对象时 D. 不自动调用 51. 当说明一个具有构造函数的对象数组时,所定义的类应该( ) A. 只能包含一个默认的构造函数 B. 应有一个包含缺省参数的构造函数 C. 至少应有两个构造函数 D. 必须有一个不带任何参数的构造函数 52. 关于常成员函数的说法中,不正确的是( ) A. 常成员函数可以引用和修改类的非常数据成员 B. const是常成员函数类型的组成部分 C. 常对象只能引用常成员函数,而不能引用非常成员函数 D. 常成员函数中不能调用非常成员函数 53. 一个类的友元函数不能访问该类所有对象的( ) A. 公用成员 B. 私有成员 C. 保护成员 D. 基类成员 54. 能够实现类对象初始化任务的是( ) A. 函数成员 B. 函数模板 C. 构造函数 D. 数据成员 55. 用new来建立生存期可控的对象,它会首先分配内存空间,然后自动调用类的( ) A. 析构函数 B. 复制函数 C. 构造函数 D. 主函数 56. 关于封装的说法中,错误的是( ) A. 通过封装,对象的全部属性和操作形成了一个整体 B. 通过封装,一个对象的实现细节被尽可能地隐藏起来 C. 通过封装,每个对象都成为相对独立的实体 D. 通过封装,对象的属性都是不可见的 57. 假定AB为一个类,则语句:AB x();的含义是( ) A. 声明AB类的构造函数,函数的返回值是AB类对象 B. 声明了一个函数x,该函数无参数,返回值是AB类对象 C. 定义AB类对象x,调用无参构造函数 D. 是一种错误的表示 58. 用来说明类的友元的是( ) A. private B. protected C. public D. friend 59. 在C++程序中,对象之间的相互通信是通过( )实现的。 A. 继承 B. 调用成员函数 C. 封装 D. 函数重载 60. C++语言中,class与struct的区别仅在于struct缺省( ) A. 私有部分 B. 函数成员 C. 数据成员 D. 访问限定符 61. 下列说法中,不正确的是( ) A. 对象是类的一个实例 B. 任何一个对象只能属于一个类 C. 一个类只能有一个对象 D. 类与对象间关系和数据类型与变量间关系类似 62. 类的析构函数的作用是( ) A. 解析构造函数 B. 初始化类 C. 撤销对象前完成清理工作 D. 删除对象 63. 已知f1和f2是同一个类的两个成员函数,但f1不能调用f2,下列选项中符合要求的是( ) A. f1和f2都是静态函数 B. f1是静态函数,f2不是静态函数 C. f1不是静态函数,f2是静态函数 D. f1和f2都不是静态函数 64. 关于友元的说法中,错误的是( ) A. 能提高程序的运行效率 B. 可以是类与类的关系 C. 能被派生类继承 D. 可以是类的成员函数与另一个类的关系 65. C++鼓励程序员将( ) A. 数据和操作分别封装 B. 不同类型的数据封装在一起 C. 数据和操作封装在一起 D. 不同作用的操作封装在一起 66. 假定AB为一个类,则执行:AB x;语句时将自动调用该类的( ) A. 有参构造函数 B. 无参构造函数 C. 复制构造函数 D. 赋值构造函数 67. 关于类和对象的描述中,不正确的是( ) A. 类就是C语言中的结构体类型,对象就是C语言中的结构体变量 B. 类和对象之间的关系是抽象和具体的关系 C. 对象是类的实例,一个对象必须属于一个已知的类 D. 类是具有共同行为的若干对象的统一描述体 68. 不是面向对象系统所包含的要素的是( ) A. 重载 B. 对象 C. 类 D. 继承 69. 下面关于对象概念的描述中,错误的是( ) A. 对象就是C语言中的结构变量 B. 对象代表着正在创建的系统中的一个实体 C. 对象是一个状态和操作(或方法)的封装体 D. 对象之间的信息传递是通过消息进行的 70. 下面关于类概念的说法中,不正确的是( ) A. 类是一种数据结构 B. 类是建立对象的关键 C. 类是数据抽象和数据隐藏的工具 D. C++语言中结构不是一种类 71. 下面关于类概念的说法中,错误的是( ) A. 类是抽象数据类型的实现 B. 类是具有共同行为的若干对象的统一描述体 C. 类是创建对象的样板 D. 类就是C语言中的结构类型 72. p指向类A数据成员m,A1是类A的一个对象,给m赋值为5的是( ) A. A1.p=5 B. A1->p=5 C. A1.*p=5 D. *A1.p=5 73. 运算符->*的功能是( ) A. 表示指向对象指针对指向类成员指针的操作 B. 表示对象对指向类成员指针的操作 C. 表示指向对象指针对类成员的操作 D. 表示对象类成员的操作 74. 已知f1(int)是类A的公有成员函数,p是指向成员函数f1的指针,则对p进行赋值的下列方 法中正确的是( ) A. p=f1; B. p=A::f1; C. p=&f1; D. P=&A::f1; 75. 下面对于友元函数描述正确的是( ) A. 友元函数的实现必须在类的内部定义 B. 友元函数是类的成员函数 C. 友元函数破坏了类的封装性和隐藏性 D. 友元函数不能访问类的保护成员 76. 一个类的友元函数或友元类能够通过成员操作符访问该类的( ) A. 私有成员 B. 保护成员 C. 公有成员 D. 所有成员 77. 为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定 义为( ) A. public B. protected C. private D. static 78. 下面对静态数据成员的描述中,正确的是( ) A. 静态数据成员可以在类体内进行初始化 B. 静态数据成员不可以被类的对象调用 C. 静态数据成员不受private控制符的限制 D. 静态数据成员可以直接用类名调用 79. 对于常数据成员,下面的描述正确的是( ) A. 常数据成员可以不初始化,并且不能更新 B. 常数据成员必须被初始化,并且不能更新 C. 常数据成员可以不初始化,并且可以被更新 D. 常数据成员必须被初始化,并且可以被更新 80. 对于常成员函数,下面描述正确的是( ) A. 类的成员函数可以操作常对象 B. 类的成员函数不能操作常对象 C. 只有常成员函数可以操作常对象 D. 在常成员函数中,常对象可以被更新 81. 类MyClass的定义如下: class MyClass { int value; public: MyClass(){value=0;} SetVariable(int i){value=i;} }; 则对下列语句序列正确的描述是( ) MyClass *p, my; p=&my; A. 语句p=&my;是把对象my赋值给指针变量p B. 语句MyClass *p,my;会调用两次类MyClass的构造函数 C. 对语句*p.SetVariable(5)的调用是正确的 D. 语句p->SetVariable(5);与语句my.SetVariable(5);等价 82. 对于拷贝初始化构造函数,正确的描述是( ) A. 在C++语言中,如果不自定义类的拷贝初始化构造函数,则每个类都有默认的拷贝初始化 构造函数 B. 必须为每个类定义拷贝初始化构造函数 C. 如果要使用拷贝初始化构造函数,则必须在类中先定义 D. 当定义了类的构造函数时,如果要使用拷贝初始化构造函数,则必须定义拷贝初始化构造 函数 83. 对于拷贝初始化构造函数和赋值操作的关系,正确的描述是( ) A. 拷贝初始化构造函数和赋值操作是完全一样的操作 B. 进行赋值操作时,会调用类的构造函数 C. 当调用拷贝初始化构造函数时,类的对象正在被建立并被初始化 D. 拷贝初始化构造函数和赋值操作不能在同一个类中被同时定义 84. 包容类(也称外围类)Contain和内嵌类(也称嵌套类)Embed定义如下: #include class Contain { int x; protected: int z; public: class Embed { int y; public: Embed(){y=100;} int Embed_Fun(); }MyEmbed; int Contain_Fun(); }; 对上面的定义,正确的描述是( ) A. 定义类Embed对象的语句是:Contain::Embed embed; B. 类Contain的成员函数Contain_Fun()中可以用MyEmbed.y的方式访问类Embed的私有成 员y C. 类Embed的成员函数Embed_Fun()中可以直接访问类Contain的私有成员x D. 类Embed的成员函数Embed_Fun()中可以直接访问类Contain的保护成员z 85. 已知类A中的一个成员函数说明为: void fun(A &a);,则其中的A &a的含义是( ) A. 将a的地址值赋给变量fun B. 指向类A的指针为a C. a是类A的对象引用,用来做函数fun()的形参 D. 变量A与a按位相与作为函数fun()的参数 86. 下列关于析构函数的说法中不正确的是( ) A. 析构函数名与类名相同 B. 析构函数没有返回值说明 C. 析构函数可以是虚函数 D. 析构函数不是对象生存期中最后一个被执行的函数 87. 一个类可以被描述为( ) A. 类是生产该类对象的工厂 B. 用来封装方法和变量的机制 C. 用于定义某个特定类型对象的模板 D. 上述选项都正确 88. C++语言中提供的( )不是类的成员,但具有类成员的特权。 A. 构造函数 B. 友元函数 C. 虚函数 D. 重载函数 89. 已知类A的公有成员函数的格式为:int fun(int x);,则定义指向该fun()函数的类成员的指针 的是( ) A. int A::*pfun(int); B. int (A::*pfun)(int); C. int *A::pfun(int); D. int (*A::pfun)(int); 90. 下列关于用户自定义的转换函数的说法中不正确的是( ) A. 不能指定自定义转换函数的返回值类型 B. 可以使用显式类型强制转换格式调用自定义的转换函数 C. 自定义转换函数的名称就是类型转换的目标类型 D. 自定义转换函数有且只有一个参数,该参数指定了被转换的类型及其值 91. 下列关于用户自定义的转换函数的说法中正确的是( ) A. 自定义转换函数必须是类的成员函数 B. 自定义转换函数可以是静态的 C. 自定义转换函数可以是友元函数 D. 自定义转换函数必须带有参数 92. 下列关于外围类和嵌套类的说法中错误的是( ) A. 嵌套类只能在外围类中使用,不能在外围类的作用域外使用 B. 外围类的成员函数对嵌套类的成员没有访问权限 C. 嵌套类的友元对外围类的成员没有访问权限 D. 嵌套类的成员函数可以在外围类定义外用外联函数实现 93. 下列关于外围类和嵌套类的说法中错误的是( ) A. 嵌套类仅仅是在语法上的嵌入 B. 嵌套类的成员函数只能使用隐式内联方式实现 C. 嵌套类的成员函数对外围类的成员没有访问权限 D. 在外围类作用域外使用嵌套类必须使用外围类名字限定 94. 下列关于外围类与嵌套类的说法中错误的是( ) A. 使用嵌套类的目的是隐藏类名,减少全局标识符 B. 外围类与嵌套类之间是一个主从关系 C. 在外围类域外定义的嵌套类对象其作用域不属于外围类 D. 嵌套类中不能说明静态成员 95. 下列关于局部类的说法中错误的是( ) A. 局部类的成员函数只能使用隐式内联方式实现 B. 局部类的作用域局限于定义它的函数内部 C. 类的成员函数中不能再定义局部类 D. 局部类中不能说明静态成员 96. 下列关于静态成员函数的说法中不正确的是( ) A. 静态成员函数不属于对象成员 B. 对静态成员函数的引用不需要使用对象名 C. 静态成员函数中可以直接引用类的非静态成员 D. 静态成员函数中可以直接引用类的静态成员 97. 下列关于友元函数的说法中不正确的是( ) A. 友元函数可以是一个普通函数,也可以是其它类的成员函数 B. 友元函数不是类的成员函数 C. 友元函数可以直接访问类的所有成员 D. 友元函数不受访问控制符的限制 98. 下列说法中正确的是( ) A. 类成员不能是类自身的对象 B. 类成员不能是类自身的引用 C. 类成员不能是类自身的指针 D. 按照占用字节数的大小从大到小定义类的数据成员有利于节省存储空间 99. 下列关于静态成员的描述中错误的是( ) A. 静态数据成员要在类体外进行初始化 B. 静态成员属于类而不属于对象 C. 对静态成员的访问不受访问权限的限制 D. 静态成员是静态存储的 100. 下列关于对象和指针的说法中错误的是( ) A. 指向对象的指针和指向类的成员的指针在表示形式上是不同的 B. 使用指向对象的指针比使用对象作函数的参数好些 C. 对象引用比对象指针作函数参数更方便 D. 指向类的成员数据的指针可以指向类中所有同数据类型的成员数据 101. 以下关于对象的叙述中,不正确的是( ) A. 产生对象时必定要调用构造函数 B. 撤消对象时必定要调用析造函数 C. 对象被保护,其私有成员不能任意访问 D. 对象可以没有构造函数和析构函数 102. 下列有关一个类的友元函数的叙述中,正确的( ) A. 允许在类外访问类中除私有成员以外的所有成员 B. 允许在类外访问类中的任何成员 C. 友元也是该类的成员 D. 友元的声明必须被放在该类的公有部分 二、填空题 1. 在C++类的成员函数中,带一个参数的构造函数 具有数据类型转换的功能。 2. 用class定义的类中,默认的成员控制符是 private。 3. 在C++中,用struct定义结构的成员默认的控制符是 public。 4. 友元破坏了类的 封装 特性。 5. 面向对象程序设计具有的 数据抽象 和 数据隐藏 机制,使得对象的内部实现 与外部相互隔离。 6. 在面向对象程序设计中,封装的基本条件是:具有一个清晰的边界,对象的私有数据、过程或函数都在该边界之内,其他对象不能直接操作该对象的私有数据;具有一个接口,该接口描述对象之间的相互关系,即对象之间的消息传递。 7. 在C++中,构造函数的作用是 对类的成员变量进行初始化。 8. 一个类的友元可以是 普通函数,也可以是 另一个类的成员函数,还可以 是 另一个类。 9. 类的友元能够访问这个类的 所有 成员。 10. 类的静态数据成员的初始化是在 类外 进行的。 11. 类的私有数据成员只能被 该类的成员函数或该类的友元 访问。 12. 类的静态成员函数 没有 this指针。 13. 类的静态成员函数访问该类的非静态成员可以通过 参数指明将被访问的非静态所属的同类的对象 来实现。 14. 不能被重载的类成员函数是 析构函数。 15. 不允许重载的类的成员函数是 析构函数。 16. 数据封装有利于提高软件的可 维护 性。 17. 在C++类中,构造函数的作用是 对类变量进行初始化。 18. 类的静态数据成员的初始化是在 类外 进行的。第七章 自定义数据类型
第八章 类和对象