C++试题及答案 下载本文

{protected:

int wheels;//车轮数 float weight;//重量 public:

void init(int wheels,float weight); int get_wheels(); float get_weight(); void print(); };

void vehicle::init(int wheels,float weight) {this->wheels=wheels; this->weight=weight; cout<

int vehicle::get_wheels() {return wheels; }

float vehicle::get_weight() {return weight;}

void vehicle::print()

{cout<<\车轮数:\重量:\答案:class car:public vehicle {private:int passengers; public:

void init(int wheels,float weight,int pass); int getpassenger(); void print();};

void car::init(int wheels,float weight,int pass) {vehicle::init(wheels,weight); passengers=pass;}

int car::getpassenger() {return passengers;} void car::print() {vehicle::print();

cout<<\可载人数:\}__

C++程序设计模拟试卷(五)

一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中 只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无 分。

1. 静态成员函数没有() A. 返回值 B. this指针 C. 指针参数 D. 返回类型 答案:B

解析:静态成员函数是普通的函数前加入static,它具有函数的所有的特征:返回类型、 形参,所以使用静态成员函数,指针可以作为形参,也具有返回值。静态成员是类具有的

属性,不是对象的特征,而this表示的是隐藏的对象的指针,因此静态成员函数没有this 指针 。静态成员函数当在类外定义时,要注意不能使用static关键字作为前缀。由于静态成员函数在 类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接 访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必 须通过参数传递的方式得到相应的对象,再通过对象来访问。

2. 在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管 理操作的函数是() A. 友元函数 B. 虚函数 C. 构造函数 D. 析构函数 答案:C

解析:定义构造函数作用就是初始化对象,而析构函数释放对象空间。虚函数用于完成多 态性,友元增加访问方便性。

3. 所有在函数中定义的变量,都是() A. 全局变量

B. 局部变量 C. 静态变量 D. 寄存器变量 答案:B

解析:变量存储类可分为两类:全局变量和局部变量。

(1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始 到源程序结束。全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用 、修改该全局变量的值,但是使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使 用全局变量。

(2)局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开始 到函数结束。局部变量包含自动变量(auto)静态变量(static)以及函数参数。

auto变量意味着变量的存储空间的分配与释放是自动进行的。说明符auto可以省略。函数中 的局部变量存放在栈空间。在函数开始运行时,局部变量被分配内存单元,函数结束时,局部变 量释放内存单元。因此,任两个函数中的局部变量可以同名,因其占有不同的内存单元而不影响 使用。这有利于实现软件开发的模块化。

static变量是定义在函数体内的变量,存放在静态存储区,不用栈空间存储,其值并不随存 储空间的释放而消失。

4. 假定AB为一个类,则执行“AB a(2), b[3],*p[4];”语句时调用该类构造函数的次数 为() A. 3 B. 4 C. 5 D. 9 答案:B

解析: a(2)调用1次带参数的构造函数,b[3]调用3次无参数的构造函数,指针没有给它 分配空间,没有调用构造函数。所以共调用构造函数的次数为4。

5. 如果表达式++a中的“++”是作为成员函数重载的运算符,若采用运算符函数调用格式,则 可表示为()

A. a.operator++(1) B. operator++(a) C. operator++(a,1) D. a.operator++() 答案:D

解析:运算符的重载,前缀先让变量变化。调用++a,等价为a.operator++(),注意无参 的形式。后缀的话a++,等价于a.operator(0),带形参,形参名可省。

6. 已知f1和f2是同一类的两个成员函数,但f1不能直接调用f2,这说明() A. f1和f2都是静态函数

B. f1不是静态函数,f2是静态函数 C. f1是静态函数,f2不是静态函数 D. f1和f2都不是静态函数 答案:C

解析:普通成员函数可以调用静态函数,相反静态函数不能调用普通成员函数,这与普通 函数与常成员函数相同。因此选择C项。

7. 一个函数功能不太复杂,但要求被频繁调用,则应把它定义为 () A. 内联函数 B. 重载函数 C. 递归函数 D. 嵌套函数 答案:A

解析:内联函数特征代码少,频繁调用,执行效率高。重载函数解决统一接口的问题;递

归是子程序调用,程序调用要耗费很多空间和时间,循环/迭代都比递归有效率得多,递归只是 从形式上,逻辑比较简洁。嵌套函数即反复调用,速度较慢。所以选择A项。 8. 解决定义二义性问题的方法有() A. 只能使用作用域分辨运算符

B. 使用作用域分辨运算符或成员名限定 C. 使用作用域分辨运算符或虚基类 D. 使用成员名限定或赋值兼容规则 答案:B

解析:解决二义性问题主要要两种方法:(1)赋值兼容规则;(2)虚基类。

9. 在main函数中可以用p.a的形式访问派生类对象p的基类成员a,其中a是() A. 私有继承的公有成员 B. 公有继承的私有成员 C. 公有继承的保护成员 D. 公有继承的公有成员 答案:D

解析:公有成员可以在类外访问,保护类型成员可以在派生类中访问,但不能在类外访问

,在main函数中访问,说明a是公有成员。只有公有继承时a才能是公有的,所以D项正确。 10. 在C++中不返回任何类型的函数应该说明为() A. int B. char C. void D. double 答案:C

解析:无形参或无返回值都可以用void来声明,int char double分别是整型、字符型和实型。 11. 若Sample类中的一个成员函数说明如下: void set(Sample& a),则Sample& a的含义是() A. 指向类Sample的名为a的指针

B. a是类Sample的对象引用,用来作函数Set()的形参 C. 将a的地址赋给变量Set

D. 变量Sample与a按位与的结果作为函数Set的参数 答案:B

解析:成员函数使用对象的引用作为形参。该函数的功能是将已知对象的所有数据成员的 值拷贝给相应对象的所有数据成员,不会建立临时对象,这里是对象的引用所以选择B。 12. 要实现动态联编必须() A. 通过成员名限定来调用虚函数 B. 通过对象名来调用虚函数 C. 通过派生类对象来调用虚函数 D. 通过对象指针或引用来调用虚函数 答案:D

解析:通过基类指针或基类引用来调用虚函数实现动态多态性,静态多态性通过重载来实 现的。所以选择D项。

13. 在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是() A. 参数类型 B. 参数个数 C. 函数名称 D. 函数体 答案:D

解析:虚函数在基类和派生类,具有相同的返回类型、形参类型和形参个数,而函数体可 以根据不同的派生类或基类实现不同的操作,即不同函数体。 14. 实现两个相同类型数加法的函数模板的声明是() A. add(T x,T y) B. T add(x,y) C. T add(T x,y) D. T add(T x,T y) 答案:D

解析:实现两个相同类型数加法结果应该和操作数具有相同类型。进行加法运算后结果也 是和参数具有相同类型,需要返回值。A无返回值时要用void,B形参无类型,C形参y没有类型 ,所以选择D项。

15. 下列不是描述类的成员函数的是() A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 答案:C

解析:友元函数虽然不是成员函数但是可以访问类所有成员。构造函数、析构函数和拷贝 构造函数(复制构造函数)都是类的特殊函数用于对象的创建和撤销,所以选择C项。 16. 继承机制的作用是() A. 信息隐藏 B. 数据封装 C. 定义新类 D. 数据抽象 答案:C

解析:面向对象设计中的类的特点:抽象、封装、继承和多态等,继承用于对类的扩展 ,所以选择C项。

17. 已知:p是一个指向类A数据成员m的指针,A1是类A的一个对象。如果要给m赋值为5,正确 的是() A. A1.p=5; B. A1->p=5; C. A1.*p=5; D. *A1.p=5; 答案:C

解析: A中p是指针即地址,错误;B选项中A1不是指针不能使用指向运算符->,错误

;“*”比“.”级别要高,所以D选项*A1.p=5相当于(*A1).p=5;错误。另外涉及到指向成员函数 时注意以下几点:

指向成员函数的指针必须于其赋值的函数类型匹配的三个方面:(1)参数类型和个数;(2)返回 类型;(3)它所属的类类型。

成员函数指针的声明:指向short型的Screen类的成员的指针定义如下: short Screen::* ps_Screen;

ps_Screen可以用_height的地址初始化如下:short Screen::*ps_Screen=&Screen::_height; 类成员的指针必须总是通过特定的对象或指向改类型的对象的指针来访问。是通过使用两个指 向成员操作符的指针(针对类对象和引用的.*,以及针对指向类对象的指针的->*)。 18. 如果采用动态多态性,要调用虚函数的是() A. 基类对象指针 B. 对象名 C. 基类对象 D. 派生类名 答案:A

解析:基类指针或者基类的引用调用虚函数都会产生动态多态性 19. 若有以下定义,则说法错误的是() int a=100,*p=&a;

A. 声明变量p,其中*表示p是一个指针变量 B. 变量p经初始化,获得变量a的地址 C. 变量p只可以指向一个整型变量 D. 变量p的值为100 答案:D

解析:指针变量如同其他变量一样,在使用之前必须先声明。声明指针变量的格式为: <类型名>*<变量名>;

其中,<类型名>是指针变量所指向对象的类型,它可以是C++语言预定义的类型,也可以是用户 自定义类型。<变量名>是用户自定义的标识符。符号*表示<变量>是指针变量。而不是普通变量 。 *表示指针,p是变量,p指向一个整型的变量,值为a的地址值,*p=100。 20. C++语言建立类族是通过() A. 类的嵌套 B. 类的继承 C. 虚函数 D. 抽象类 答案:B

解析:类族即同一个类派生出来的类,各个类是兄弟或父子关系。

二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答 案。错填、不填均无分。

1. 假设int a=1,b=2;则表达式(++a/b)*b--的值为___。 答案:2

[解析]前缀++或――表示先使变量值变化,再使用,这和后缀恰恰相反。但是编译 cout<<(++a/b)*b--时,先++a/b值为1,后1*b--,先取b=2,结果为2,再让b=1。 2. 复制构造函数使用___作为形式参数。 答案:对象的引用

[解析]复制构造函数使用对象的引用来初始化一个新对象,避免临时产生对象。 3. 通过C++语言中的___机制,可以从现存类中构建其子类。 答案:继承

[解析]继承概念,从现有的类生成新类,原有的类称为父类或基类,新类又称子类或派生类或 衍生类,它是对基类的扩充。

4. 静态成员函数、友元函数、构造函数和析构函数中,不属于成员函数的是___。 答案:友元函数

[解析]友元函数不是类成员,但可以访问类成员。类的封装性保证了数据的安全,但引入友元 ,虽然访问类是方便了,但确实破坏类访问的安全性。 5. 在下面的类定义中,私有成员有___。 class Location {int X,Y; protected:

int zeroX,zerxY;

int SetZero(intzeroX, intzeroY); private:

int length,height; public:

void init(int initX,int initY); int GetX(); int GetY(); };

答案: X,Y,length,height

6. 在C++程序设计中,建立继承关系倒挂的树应使用___继承。