《c++笔试题含(答案)(共14页).doc》由会员分享,可在线阅读,更多相关《c++笔试题含(答案)(共14页).doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上C语言程序设计一、选择题 (1)C+语言是从早期的C语言逐渐发展演变而来的.与C语言相比,它在求解问题方法上进行的最大改进是()A)面向过程B)面向对象C)安全性D)复用性(2)C+语言的跳转语句中,对于break和continue说法正确的是() A)break语句只应用与循环体中 B)continue语句只应用与循环体中 C)break是无条件跳转语句,continue不是 D)break和continue的跳转范围不够明确,容易产生问题 (3)for(intx=,y=o;!x&y=5;y+)语句执行循环的次数是() A)B)C)D)无次数(4)考虑函数原型voi
2、dtest(inta,intb=7,char=*),下面的函数调用中,属于不合法调用的是() A)test(5);B)test(5,8);C)test(6,#)D)test(0,0.*); (5)下面有关重载函数的说法中正确的是() A)重载函数必须具有不同的返回值类型;B)重载函数形参个数必须不同; C)重载函数必须有不同的形参列表D)重载函数名可以不同; (6)下列关于构造函数的描述中,错误的是() A)构造函数可以设置默认参数;B)构造函数在定义类对象时自动执行C)构造函数可以是内联函数;D)构造函数不可以重载(7)下面描述中,表达错误的是() A)公有继承时基类中的public成员在派
3、生类中仍是public的 B)公有继承是基类中的private成员在派生类中仍是private的 C)公有继承时基类中的protected成员在派生类中仍是protected的 D)私有继承时基类中的public成员在派生类中是private的 (8)应在下列程序划线处填入的正确语句是() #include classBase public: voidfun()coutBase:funENDL; ; classDerived:publicBase voidfun() _/显示调用基类的函数fun() coutDerived:funfun(); (9)有如下程序: include classBA
4、SE charc; public: BASE(charn):c(n) virtualBASE()coutC; ; classDERIVED:publicBASE charc; public: DERIVED(charn):BASE(n+1),c(n) DERIVED()coutC; ; intmain() DERIVED(X); return0; 执行上面的程序将输出() A)XYB)YXC)XD)Y 二、填空题 (1)下面程序的打印结果是1 #incudeintf(int); intmain() inti; for(i=0;i5;i+) coutF(I)0;i-) k+=i; returnk
5、; 1251121(2)在用class定义一个类时,数据成员和成员函数的默认访问权限是2 private或私有(3)含有纯虚函数的类称为3抽象类 (4)已知intDBL(intn)returnn+n;和longDBL(longn)returnn +n;是一个函数模板的两个实例,则该函数模板的定义是4 templateTDBL(Tn)returnn+n;选择题对于全局函数 int f(void) ,与其完全等价的函数原型为: A. int& f( ); B. int f(void ) const; C. const int f( ); D. A、B、C都不是 2. 类A中有唯一的非静态成员函数i
6、nt f(A& one)和私有的数据成员int x;,那么在此成员函数的函数体中可以有语句: A. return one.f(this); B. x=f(this); C. this-f(x.one); D. int* const pX=&one.x; 3. 下面关于new 和delete操作符的说法,哪个是不正确的: A. 使用new操作符,可以动态分配全局堆中的内存资源。 B. 若p的类型已由A*强制转换为void *,那么执行语句delete p;时,类A的析构函数不会被调用。 C. 实现全局函数时,new和delete通常成对地出现在由一对匹配的花括号限定的语句块中。 D. 执行语句A
7、 * p=new A100;时,类A的构造函数只会被调用1次。 4. 类TM和类TN是两个独立的类,那么类TM中哪种形式的数据成员一定是不允许的: A. TM* a; B. TN& a; C. TM a; D. TN a; 5. 类B是通过public继承方式从类A派生而来的,且类A和类B都有完整的实现代码,那么下列说法正确的是: A. 类B中具有pubic可访问性的成员函数个数一定不少于类A中public成员函数的个数。 B. 一个类B的实例对象占用的内存空间一定不少于一个类A的实例对象占用的内存空间。 C. 只要类B中的构造函数都是public的,在main函数中就可以创建类B的实例对象。
8、 D. 类A和类B中的同名虚函数的返回值类型必须完全一致。 6. 下列哪种函数可以是虚的: A. 自定义的构造函数 B. 拷贝构造函数 C. 静态成员函数 D. 析构函数 7. 类A有一个实例化的常量对象a,那么下面的说法中不正确的是: A. 类A中的非静态数据成员一定都是常量成员。 B. 通过a可以直接调用类A的常量成员函数。 C. a不能直接作为左值表达式使用。 D. a可以是静态常量对象。 8. 在不考虑强制类型转换的情况下,关于类中常量成员函数的下列说法不正确的是: A. 常量成员函数中不能修改本类中的非静态数据成员。 B. 常量成员函数中可以调用本类中的任何静态成员函数。 C. 常量
9、成员函数的返回值只能是void或常量。 D. 若常量成员函数中调用虚函数f,那么函数f在本类中也一定是一个常量成员函数。 9. 类C是以多重继承的方式从类A和类B继承而来的,类A和类B无公共的基类,那么: A. 类C的继承方式只能采用public继承。 B. 可改用单继承的方式实现类C的同样功能。 C. 类A和类B至少有一个是抽象类。 D. 类A和类B至少有一个是虚基类。 10. 下列哪种用法不能体现类A和类B之间的组合关系: A. 类A中声明数据成员B b; B. 类A中声明数据成员B* b; C. 类A中声明数据成员const B& b; D. 类A中声明成员函数 B func( B& o
10、bj); 二、(共10分,每题2分,多选、少选、错选都不得分)多项选择 1. 下面关于指针变量和引用变量的说法正确的是: A. 指针变量存放的是内存地址,并且可以置为0。 B. 定义引用变量时,必须同时指明具体被引用的对象或变量。 C. 使用取地址操作符,可以取得指针变量自身的地址,但取不到引用变量自身的地址。 D. 类中的数据成员可以是指针变量,但不能是引用变量。 2. 类A中有唯一的一个公有成员函数f,对于类A的一个对象a,执行语句 a.f(100);成功,那么f 的函数原型可以为: A. A& f( int, int=50); B.void f(int&) const; C.const
11、A * f(const int ); D. A f( const int&) const; 3. 关于类中重载赋值运算符的正确说法是: A. 由编译器提供的缺省赋值函数具有public访问性并且执行按位赋值。 B. 在重载派生类的赋值操作时,不但要实现派生类中数据成员的赋值,还要负责基类中数据成员的赋值。 C. 只有在类中含有指针数据成员或引用数据成员时,才需要重载类的赋值操作。 D. 通过修改类A的声明或定义,可以禁止用户在类A对象间进行任何赋值操作。 4. 在类的静态成员函数的实现体中,可以访问或调用: A. 本类中的静态数据成员 B. 本类中非静态的常量数据成员 C. 本类中其它的静态成
12、员函数 D. 本类中非静态的成员函数 5. 关于异常和C+提供的异常处理机制正确的说法是: A. 若程序员预见到程序中的异常,则一定可以通过修改程序代码来避免异常出现。 B. 使用dynamic_cast操作符可能会产生异常。 C. 异常可以用catch进行捕获处理。 D. 异常可以是对象,也可以是普通整数。 三、(共20分,每题2分)判断正误,对于你认为错误的论述,说明原因或举出反例。 1. 函数体内声明的静态变量,至多只会被初始化一次。 对2. 对于同一个类中的两个非静态成员函数,它们的函数的名称、参数类型、参数个数、参数顺序以及返回值的类型不能完全相同。 错 如可有两个成员函数,int
13、f();和 int f() const;3. inline函数表示编译器一定会将函数体直接插入到调用此函数的地方,这样可以加快程序的运行速度。 错 是否真正内联,由编译器决定。如函数是递归函数,那么永远不会内联。4. 每个cpp文件是单独编译的,但一个程序中多个cpp文件的编译顺序是不固定的。 对5. 将类A所有构造函数的可访问性都限制为私有的,那么在main函数中不可能得到类A的实例对象。 错 可通过类的静态成员函数创建实例。6. 名字空间是可以多层嵌套的;对于类A中的函数成员和数据成员,它们都属于类名A代表的一层名字空间。 对7. 若在类Base和派生类Derived中,分别声明一个同名的
14、整型成员变量int x; ,那么通过Derived类的实例对象,不可能输出基类Base中的变量x的值。 . 错 如可通过继承自基类的成员函数访问基类中的x8. 若类A是类B的友员类,且类B是类C的友员类,那么类A也是类C的友员类。 错 友员关系不具有传递性。9. 虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。 对10. 构造函数的初始化列表中的内容,不会影响构造对象中成员数据的初始化顺序。 对六、(共20分)回答下列各题 1. 说明类中的public、 protected和 private成员函数分别在public、protected和pri
15、vate继承方式下在派生类中的可访问性。(4分) 重点是基类中的任何Private在派生类中都是不可访问的。2. 若类A和类B没有继承关系,对于函数void func(A&) ,请至少用两种不同方法说明如何才能传递一个非常量的B类对象给func函数。(4分) 可在A类中定义一个构造函数:A(const B&); 或在B类中定义一个自动转换函数: operator A( ) const;4. 举例说明重载(overload) 、重定义(redefine) 和重写(override)的含义。(3分) 如类A中有函数 int f(void);和int f(int);为重载(overload) (同名
16、,参数不同) 如类A中有函数 int f(void);,A的派生类B中给int f(void)一个新的实现体,为redefine 如类A中有虚函数 virtual int f(void);,A的派生类B中给virtual int f(void)一个新的实现体, 为override.5. 通常类A的拷贝构造函数的原型写为A(const A&);,请问为什么参数一定要使用引用形式?使用const修饰符除了可以防止修改传递给构造函数的实参外,还有什么作用?(3分) A(const A& one ).当调用此拷贝构造函数时,需将参数压栈,若不使用&,就需要在 栈内创建一个one的副本,而这需要用拷贝构
17、造函数。这样就会形成递归调用。 使用const,还允许用一个常量对象作为样本,来构造一个新的对象。6. 程序员规范中要求不要写出类似(+i)+(i+) 或 f(+i,i+)这样的代码,请说明原因。(3分) 计算子表达式的顺序由编译器决定的,虽然参数的压栈顺序在给定的调用方式下式固定的, 但参数表达式的计算顺序也由编译器决定的。不同的编译器或不同的表达式计算的顺序可能 不一致。七、(共8分)阅读下面部分程序代码,完成3个问题。 #include class A public: A(int v1)(v1) virtual int GetData( ) const return x; private
18、: int x; ; class B:public A public: B(int v1,int v2):A(v1),y(v2) virtual int GetData( ) const return y; private: int y; ; class C:public B public: C(int v1,int v2,int v3):B(v1,v2),z(v3) virtual int GetData( ) const return z; private: int z; ; const A& max2(const A& one,const A& two) return (onetwo?o
19、ne:two); void main() B b(1,2); C c(100,10,1); coutmax2(b,c).GetData( )endl; coutmax2(b,5).GetData( )(const A& one, const A& two) return one.GetData()two.GetData(); 2)若不改变函数max2的函数体,只将函数声明改成A& max2(const A& one,const A& two),请问这样行吗?为什么? 不行。 return (onetwo?one:two); 时,不能将常量赋给变量。3)若main中有语句A* p=new C(1
20、,2,3);和delete p;,那么类A、类B和类C应做何修改? 需要将ABC三个类的析构函数改为虚的。选择题1由C+目标文件连接而成的可执行文件的缺省扩展名为 。 A cpp B. exe C obj D. lik2在下面的一维数组定义中,哪一个有语法错误。 A. int a =1,2,3 B. int a10=0 C. int a D. int a53在下面的函数声明中,存在着语法错误的是 。 A. void BC(int a , int) B. void BD(int , int) C. void BE(int , int=5) D. int BF(int x ; int y)4. 假
21、定AB为一个类,则该类的拷贝构造函数的声明语句为 。 A AB &(AB x) B. AB(AB x) C AB(AB &) D. AB(AB * x)5对于结构中定义的成员,其隐含访问权限为 。 A public B. protected C private D. static6当使用fstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为 。 A ios:in B. ios:out C ios:int | ios:out D. 没有二、填空题1执行“cout 43-18=43-18endl;”语句后得到的输出结果为43-18=25 。2已知AZ的ASCII码为6590,当
22、执行“char ch=14*5+2; cout chy和xb) 10设px是指向一个类动态对象的指针变量,则执行“delete px;”语句时,将自动调用该类的析构函数。11若需要把一个函数“void F( );”定义为一个类AB的友元函数,则应在类AB的定义中加入一条语句:friend void F( ); 。12若要在程序文件中进行标准输入输出操作,则必须在开始的 # include 命令中使用iostream.h 或 iomanip.h 头文件。1在类中必须声明成员函数的 原型 ,成员函数的 实现 部分可以写在类外。2如果需要在被调函数运行期间,改变主调函数中实参变量的值,则函数的形参应
23、该是 引用 类型或 指针 类型。3 抽象 类只能作为基类使用,而不能声明它的对象。4进行函数重载时,被重载的同名函数如果都没有用const修饰,则它们的形参 个数 或 类型 必须不同。5通过一个 常 对象只能调用它的常成员函数,不能调用其他成员函数。6函数的递归调用是指函数直接或间接地调用 自身 。7拷贝构造函数的形参必须是 本类对象的引用 。三、下列程序运行后的输出结果1 # include void main() int s=0; for (int i=1; ; i+) if (s50) break; if (i%2=0) s+=i; cout i,s=i,sendl;i,s=15,562
24、 # include void main() char a=abcdabcabfgacd; int i1=0,i2=0,i=0; while (ai) if (ai=a) i1+; if (ai=b) i2+; i+; cout i1 i2endl;4 33 # include void main() int a9=2,4,6,8,10,12,14,16,18; for (int i=0; i9; i+) cout setw(5)*(a+i); if (i+1)%3=0) cout endl; 2 4 6 8 10 12 14 16 184 # include void LE(int * a,
25、int * b) int x=*a; *a=*b; *b=x; cout *a *bendl;void main() int x=10,y=25; LE(&x,&y); cout x yendl;25 1025 105 # include class A int a,b;public : A() a=b=0; A(int aa,int bb) a=aa; b=bb; cout a bendl; ;void main() A x,y(2,3),z(4,5);2 3 4 56 # include template class FF TT a1,a2,a3;public : FF(TT b1,TT
26、b2,TT b3) a1=b1; a2=b2; a3=b3; TT Sum() return a1+a2+a3; ;void main() FF x(2,3,4),y(5,7,9); cout x.Sum() y.Sum()endl;9 211. 分析下面程序的运行结果#includeiostreamusing namespace std;void myFunction();int x=5,y=7;int main() cout”x from main:”x”n”;cout”y from main:”y”n”;myFunction();cout”Back from myFunction!nn”
27、;cout”x from main:”x”n”;cout”y from main:”y”n”;return 0; void myFunction() int y=10;cout”x from myFunction:”x”n”;cout”y from from myFunction:”y”n”;运行时输出的结果是 x from main:5y from main:5x from myFunction:5y from myFunction:10Back from myFunction!x from main:5y from main:72分析下面程序的运行结果/Rectangle.hclass P
28、ointpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff, float yOff) X+=xOff;Y+=yOff;float GetX() return X;float GetY() return Y;private:float X,Y;class Rectangle: public Pointpublic:void InitR(float x, float y, float w, float h)InitP(x,y);W=w;H=h;float GetH() return H;float Get
29、W() return W;private:float W,H;#include#include#include rectangle.husing namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(), rect.GetY(), rect.GetW(), rect.GetH()endl;运行时输出的结果是 The data of rect(X,Y,W,H); 5,5,20,103.分析下面程序的运行
30、结果#include using namespace std;class B0public:void display()coutB0:display()endl; ;class B1: public B0public:void display()coutB1:display()endl;/;class D1: public B1public:void display()coutD1:display()display();int main()B0 b0;B1 b1;D1 d1;B0 *p;p=&b0;fun(p);p=&b1;fun(p);p=&d1;fun(p);运行时输出的结果是 B0:di
31、splayB0:displayB0:display4. 有如下程序: #includeusing namespace std;class test private:int a;public:test()coutconstructorn;test(int a)coutaendl;coutcopy constructorn;test()coutdestructorn;int main()test A(3);return 0;运行时输出的结果是 3copy constructor destruclor5.若有如下类声明 class My Class public:MyClass() cout1;执行
32、语句MyClass a,b2,*P2;以后,程序的输出结果是1116. 有如下程序: #includeusing namespace std;class point public:static int number;public:point()number+;point()number-; int point:number=0;void main()point *ptr;point A,B;point *ptr_point=new point3;ptr=ptr_point;point C;coutC.number; deleteptr;运行时输出的结果是 6四、写出下列每个函数的功能1doub
33、le SF(double x,int n) / n为大于等于0的整数 double p=1,s=1; for (int i=1; ix; while (x!=-1) n+; y+=x; cin x; if (n=0) return y; else return y/n;求出从键盘上输入的一批常数的平均值,以-1作为结束输入的标志。3 # include void WA(int a,int n) for (int i=0; in-1; i+) int k=i; for (int j=i+1; jn; j+) if (ajak) k=j; int x=ai; ai=ak; ak=x; 采用选择排序的方法对数组a中的n个整数按照从小到大有次序重新排列。4 # include # include void JB(char * fname) / 可把以fname所指字符串作为文件标识符的文件称为fname文件 / 假定该文件中保存着一批字符串,每个字符串的长度均小于20 ifstream fin(fname); char a20; int i=0; while (fina) cout aendl; i+; fin.close(); cout i=iendl;从向文件fname中依次读取每个字符串并输出到屏幕上显示出来,同时统计并显示出文件中的字符串个数。专心-专注-专业