c++考试复习重点.docx_第1页
c++考试复习重点.docx_第2页
c++考试复习重点.docx_第3页
c++考试复习重点.docx_第4页
c++考试复习重点.docx_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计科一班C+复习资料说明:这上面的题目全部来自二级C+试卷,且基本涵盖上边所有与我们考试有关的题目。第一大项:选择题(1) 基本书本概念题1.下列关于C+函数的叙述中,正确的是(C)A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值C)函数在被调用之前必须先声明 D)函数不能自己调用自己2.下列关于类和对象的叙述中,错误的是(A)A)一个类只能有一个对象 B)对象是类的具体实例 C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系3)在C+中,用于实现运行时多态性的是DA)内联函数B)重载函数C)模板函数D)虚函数4).1在C+中,编译系统自动为一个类生成缺省构造函数的条件是(A)。A)该类没有定义任何有参构造函数B)该类没有定义任何无参构造函数C)该类没有定义任何构造函数D)该类没有定义任何成员函数4).2下列关于派生类构造函数和析构函数的说法中,错误的是(D)A)派生类的构造函数会隐含调用基类的构造函数B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数D)在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数运算符的重载(书本P307)函数重载是对已有的运算符赋予多重含义,使用同一运算符作用于不同类型数据时导致不同的行为。三个规则5).1下列关于运算符重载的叙述中,错误的是(B)。A)有的运算符可以作为非成员函数重载B)所有的运算符都可以通过重载而被赋予新的含义(规则1中C+中除少数运算符外,全部可以重载)C)不得为重载的运算符函数的参数设置默认值D)有的运算符只能作为成员函数重载5).2下列有关函数重载的叙述中,错误的是(C)A)函数重载就是用相同的函数名定义多个函数B)重载函数的参数列表必须不同C)重载函数的返回值类型必须不同D)重载函数的参数可以带有默认值5).3关于函数重载,下列叙述中错误的是(C)A)重载函数的函数名必须相同 B)重载函数必须在参数个数或类型上有所不同C)重载函数的返回值类型必须相同D)重载函数的函数体可以有所不同5).4下列关于运算符重载的描述中,正确的是(A)(一元就是单目,二元就是双目)A)运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符B)一元运算符只能作为成员函数重载(也可以是非成员函数)C)二元运算符重载为非成员函数时,参数表中有一个参数(必须是两个)D)C+中可以重载所有的运算符5).5通过运算符重载,可以改变运算符原有的(A)A)操作数类型B)操作数个数C)优先级D)结合性5).6关于运算符重载,下列表述中正确的是(C)A)C+已有的任何运算符都可以重载B)运算符函数的返回类型不能声明为基本数据类型C)在类型转换符函数的定义中不需要声明返回类型D)可以通过运算符重载来创建C+中原来没有的运算符5).7下列关于运算符重载的叙述中,正确的是(B)A)通过运算符重载,可以定义新的运算符B)有的运算符只能作为成员函数重载C)若重载运算符+,则相应的运算符函数名是+(+(形参表)D)重载一个二元运算符时,必须声明两个形参(只有一个形参,左操作数是对象本身的数据,右操作数是形参)继承与派生1.派生类应当向基类的构造函数传递参数.6).1对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该基类成员的访问权限是(D)。A)公有或私有B)私有C)保护或私有D)公有或保护6).2下列有关类继承的叙述中,错误的是(D)A)继承可以实现软件复用B)虚基类可以解决由多继承产生的二义性问题C)派生类构造函数要负责调用基类的构造函数D)派生类没有继承基类的私有成员6).3如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问属性分别是(D)B)public和protectedC)protected和publicD)protected和protected6).4派生类的成员函数不能访问基类的(C)A)公有成员和保护成员B)公有成员C)私有成员D)保护成员6).5有如下类声明:classFoointbar;则Foo类的成员bar是(C)(不定义就默认为私有成员)A公有数据成员C私有数据成员B)公有成员函数D)私有成员函数7)定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为(A)。A)私有继承B)非私有继承C)保护继承D)公有继承8)建立一个有成员对象的派生类对象时,各构造函数体的执行次序为(C)。A)派生类、成员对象类、基类B)成员对象类、基类、派生类C)基类、成员对象类、派生类D)基类、派生类、成员对象类9).1在一个抽象类中,一定包含有(C)。A)虚函数B)纯虚函数C)模板函数D)重载函数10)下列有关C+流的叙述中,错误的是(A)A)C+操作符setw设置的输出宽度永久有效B)C+操作符endl可以实现输出的回车换行C)处理文件I/O时,要包含头文件fstreamD)进行输入操作时,eof()函数用于检测是否到达文件尾10).2如果利用C+流进行输入输出,下面的叙述中正确的是(A)A)只能借助于流对象进行输入输出B)只能进行格式化输入输出C)只能借助于cin和cout进行输入输出D)只能使用运算符和进行输入输出10).3使用输入输出操作符setw,可以控制(B)A)输出精度B)输出宽度C)对齐方式D)填充字符10).4下列关于C+流的说明中,正确的是(A)A)与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现B)从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作(读操作叫做提取,写操作叫做插入,选项正好反了。)C)cin是一个预定义的输入流类(CIN是一个预定义的输入流类ISTREAM的对象)D)输出流有一个名为open的成员函数,其作用是生成一个新的流对象(打开一个文件输入流关联的文件)10).5对于语句coutendlx;中的各个组成部分,下列叙述中错误的是(D)A)cout是一个输出流对象B)endl的作用是输出回车换行C)x是一个变量D)”,插入运算符是“”)虚函数必须是非静态成员函数。将基类中的同名函数定义位虚函数,这样通过基类型指针就可以使属于不同派生类的不同对象产生不同的行为。从而实现函数的多态(PAGE316)。纯虚函数是在基类中声明一个虚函数,基类中没有具体定义,要求各派生类根据实际情况给出具体定义,纯虚函数的声明以“=0;”结束抽象类:带有纯虚函数的类。11)下列有关抽象类和纯虚函数的叙述中,错误的是(D)A)拥有纯虚函数的类是抽象类,不能用来定义对象B)抽象类的派生类若不实现纯虚函数,它也是抽象类C)纯虚函数的声明以“=0;”结束D)纯虚函数都不能有函数体(纯虚函数的函数体由派生类给出。)11).2下列关于虚函数的说明中,正确的是(B)A)从虚基类继承的函数都是虚函数B)虚函数不能是静态成员函数C)只能通过指针或引用调用虚函数D)抽象类中的成员函数都是虚函数(12)对于一个类定义,下列叙述中错误的是(B)A)如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数B)如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数(只有没有构造函数的情况下)D)进行输入操作时,eof()函数用于检测是否到达文件尾C)如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D)如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造.函数内联函数不是在调用时发生转移,而是编译时将函数体嵌入每一处调用处。注意现代的编译器,没有inline也可以是内联函数。13).1下列有关内联函数的叙述中,正确的是(C)A)内联函数在调用时发生控制转移B)内联函数必须通过关键字inline来定义C)内联函数是通过编译器来实现的D)内联函数函数体的最后一条语句必须是return语句13).2下列关于C+函数的说明中,正确的是(C)A)内联函数就是定义在另一个函数体内部的函数B)函数体的最后一条语句必须是return语句C)标准C+要求在调用一个函数之前,必须先声明其原型D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式标示符:程序员定义的单词。C+中的标识符的构成规则如下:1. 以大写字母和小写字母以及下划线开始2. 由大小写母,数字,下划线组成。3. 大小字母表示不同的意义。4. 不能是C+的关键字。(14)下列符号中可以用作C+标识符的是(A)A)_radiusB)foobar(出现不明符号)C)else(关键字)D)3room(不能由数字开始)14).1下列字符串中,正确的C+标识符是(D)A)foo-1B)2bC)newD)_256函数模板TEMPLATE类型名函数名函数体的定义所有模板的定义都是用TEMPLATE开始的,模板参数表用逗号相隔的模板参数构成类模板:定义一个类的家族,使得一些数据成员,成员函数的参数,返回值,局部变量能取任意类型。(15)下列关于模板的叙述中,错误的是(C)A)模板声明中的第一个符号总是关键字templateB)在模板声明中用括起来的部分是模板的形参表C)类模板不能有数据成员D)在一定条件下函数模板的实参可以省略THIS指针是类自动生成自动影藏的私有成员,它存在于非静态成员函数中,指向被调用的函数所在对象地址。全局只有一个THIS指针,当一个对象被创建时,THIS就指向对象数据的首地址。(16)下列关于this指针的叙述中,正确的是(D)A)任何与类相关的函数都有this指针B)类的成员函数都有this指针C)类的友元函数都有this指针D)类的非静态成员函数才有this指针(2)程序运行结果题枚举元素常常具有默认值,比如下面这个题目中NAME=0,NUMBER=1,PLUS=5,MINUS=6,PRINT=10.1已知枚举类型定义语句为:enumTokenNAME,NUMBER,PLUS=5,MINUS,PRINT=10;则下列叙述中错误的是(A)A) 枚举常量NAME的值为1B)枚举常量NUMBER的值为1C)枚举常量MINUS的值为6D)枚举常量PRINT的值为102执行语句序列inti=0;while(i25)i+=3;couti;输出结果是(C)A)24B)25C)27D)284有如下程序:#includevoid fun(int &x,int y)int t=x;x=y;y=t;int main()int a2=23,42;fun(a1,a0);std:couta0,a1std:endl;return0;执行后的输出结果是(B)A)42,42B)23,23C)23,42D)42,23分析:a0=23,a1=42,fun(a1,a0);int&x=42,y=23,交换次序后x=23,y=42,int&x表示按地址出送,只要x的值变化了原来的a1也变化。Intx则指变量本身,局部变量变化不会改变变量的值。5有如下类声明:class MyBASEint k;public:void set(intn)k=n;int get() const returnk;class MyDERIVED: protected MyBASEprotected:int j;public:void set(int m,int n)MyBASE:set(m);j=n;int get() const return MyBASE:get()+j;则类MyDERIVED中保护的数据成员和成员函数的个数是(B)A)4B)3C)2D)1分析:MyDERIVED是MyBASE的保护继承,所以两个成员函数都是受保护的。6.有如下程序:#includeusing name space std;int main()cout.fill(*);cout.width(6);cout.fill(#);cout123endl;return0;执行后的输出结果是(A)A)#l23B)123#C)*123D)123*分析:这是一个关于c+流中使用插入运算符和操纵符的问题。(page484)。cout.fill(*)表示用*填充空白部分,cout.width(6)表示设定六位宽度,对齐方式右对齐。上面的代码首先是设定*填充空白,然后设定6位长度,再重新设定#填充空白部分,接着输入123,右对齐。7有如下程序:#includeusing namespace std;class Testpublic:Test()n+=2;Test()n-=3;static int getNum()return n;private:static int n;int Test:n=1;int main()Test*p=new Test;Delete p;coutn=Test:getNum()endl;return0;执行后的输出结果是(A)A)n=0B)n=lC)n=2D)n=3分析:Test*p=newTest;调用构造函数n=3,deletep;调用解析函数n=0;最后输出。8有如下程序:#includeusing namespace std;class Apublic:A()coutA;classBpublic:B()coutB;classC:publicABb;public:C()coutC;Int main()Cobj;return0;执行后的输出结果是(D)A)CBAB)BACC)ACBD)ABC9.#includeusing namespace std;intmain()void function(doubleval);double val;function(val);coutval;return0;void function(doubleval)val=3;编译运行这个程序将出现的情况是(D)A) 编译出错,无法运行B)输出:3C)输出:3.0D)输出一个不确定的数10.有如下程序:#includeusing namespace std;class Objstatic int i;public:Obj()i+;Obj()i-;static int getVal()return i;intObj:i=0;void f()Obj ob2;coutob2.getVal();int main()Obj ob1;f();Obj*ob3=new Obj;coutgetVal();delete ob3;coutObj:getVal();return0;程序的输出结果是(D)A)232B)231C)222D)221分析:voidf()Objob2;coutob2.getVal();同时调用构造和析构函数。二,填充题基本概念填空1.有一种只在循环语句或switch语句中使用的流程控制语句,表示该语句的关键字是_break_。2.程序中有如下语句for(int i=0;i5;i+)cout*(p+i),;能够依次输出int型一维数组DATA的前5个元素。由此可知,变量p的定义及初始化语句是_int*p=DATA_。3.若将一个二元运算符重载为类的成员函数,其形参个数应该是_1_个。4.C+语言中的多态性分为编译时的多态性和_运行时_的多态性。5在面向对象的程序设计中,将数据和处理数据的操作封装成一个整体就定义了一种事物的类型,称作“类”。类是一种抽象的概念,属于该类的一个实例叫做“_对象_”。6指针数组是由_指针或指针变量 构成的数组。7如果使用数组名称为函数参数,形实结合时,传递的是_地址_。8在类的对象被创建的时候, 静态 函数会被自动调用。2,读代码填空或给出运行结果。1.#include using namespace std; class PARENTpublic:PARENT() cout PARENT; ;class SON : public PARENT public:SON() cout SON; ;int main() SON son; PARENT *p; p = &son; return 0;运行结果:PARENTSON,这里涉及到主函数中定义一个派生类的对象一定是先调用基类的构造函数,然后再调用派生类的构造函数。下面把代码把上面的代码稍微改一下。#include using namespace std;class PARENTpublic: PARENT() cout PARENT; ;class SON : public PARENT public: SON() cout SON; ;int main() SON son; PARENT p; p = son; return 0;运行结果变为PARENTSONPARENT对比上面的代码说明定义类的指针对象不会调用构造函数。real+a.real,imag+a.imag3)已知下列程序的输出结果是 42,请将画线处缺失的部分补充完整。 #include using namespace std; class Foo int value; public:Foo( ) : value(0) void setValue(int value) _this-value_ = value;void print( ) cout value; ;int main( ) Foo f; f.setValue(42); f.print(); return 0;4)以下代码运行结果是9SS9S#include using namespace std; class A int a; public:A():a(9)virtual void print() const couta; ;class B : public A char b;public:B( )b=S;void print( ) const cout print(); show(d1); show(d2); return 0;6)下面程序的运行结果是AAB#include using namespace std;class CApublic: CA( )coutA ;class CB:private CApublic: CB( )coutB;int main() CA a; CB b;(先调用基类在调用派生类) return 0;7)下面的程序的运行结果是11333#includeusing namespace std;class DA int k;public: DA(int x=1):k(x) DA( )coutk;int main( ) DA d=DA(3),DA(3),DA(3); DA *p=new DA2; delete p; return 0;分析:自己也有点不清楚,但是调试后我是这样解释这个答案的,析构时输出k, DA *p=new DA2;拥有两个成员,没有具体说明,所以就是题目默认k=1,所以显示两个1,DA d=DA(3),DA(3),DA(3);然后是一个拥有三个成员的数组,其中k=3,所以显示三个3.8)如下类定义中包含了构造函数和拷贝构造函数的原型声明,请在横线处填写正确的内容,使拷贝构造函数的声 明完整。class myClass private:int data; public:myClass(int value); myClass(const_myClass& anotherObject); 复制构造函数的定义形式为 类名(类名&对象名)9)请在如下程序中的空格处填写正确的语句:#include using namespace std; class Basepublic:void fun()coutBase funendl; ;class Derivde:public Base public:void fun()_ Base:fun()_/ 调用基类的函数 fun() coutDerived funendl;10)请将下列栈类 Stack 补充完整class Stack private:int pList100;int top; public:Stack():top(0)void Push(const int &item); int Pop(void);void Stack:Push(const int &item)if(top=99) exit(1);top+; pListtop=item; int Stack:Pop() if(top0)exit(1);return pListtop-;书本page370,if(top=99) exit(1);top+; pListtop=item; 只要不到top=99,就一直压入堆栈,书上是plist+list=item.三.编程题书本题第八章8-4.定义计数器Counter类,对其重载运算符+。源程序:typedefunsignedshortUSHORT;#includeclassCounterpublic:Counter();Counter(USHORTinitialValue);Counter()USHORTGetItsVal()constreturnitsVal;Void SetItsVal(USHORTx)itsVal=x;Counter operator+(constCounter&);private:USHORTitsVal;Counter:Counter(USHORTinitialValue):itsVal(initialValue)Counter:Counter():itsVal(0)Counter Counter:operator+(constCounter&rhs)returnCounter(itsVal+rhs.GetItsVal();int main()CountervarOne(2),varTwo(4),varThreevarThree=varOne+varTwo;coutvarOne:varOne.GetItsVal()endl;coutvarTwo:varTwo.GetItsVal()endl;coutvarThree:varThree.GetItsVal()endl;return0;程序运行输出:varOne:2varTwo:4varThree:68-8定义一个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员函数fn1()、fn2(),fn1()是虚函数,DerivedClass也有成员函数fn1()、fn2(),在主程序中定义一个DerivedClass的对象,分别用BaseClass和DerivedClass的指针来调用fn1()、fn2(),观察运行结果。#includeclassBaseClasspublic:virtualvoidfn1();voidfn2();void BaseClass:fn1()cout调用基类的虚函数fn1()endl;voidBaseClass:fn2()cout调用基类的非虚函数fn2()endl;classDerivedClass:publicBaseClasspublic:void fn1();void fn2();void DerivedClass:fn1()cout调用派生类的函数fn1()endl;void DerivedClass:fn2()cout调用派生类的函数fn2()fn1();pBaseClass-fn2();pDerivedClass-fn1();pDerivedClass-fn2();程序运行输出:调用派生类的函数fn1()调用基类的非虚函数fn2()调用派生类的函数fn1()调用派生类的函数fn2()第七章7-8定义一个Document类,有name成员变量,从Document派生出Book类,增加PageCount变量。#include#includeclass Documentpublic:Document();Document(char*name);char*Name;/Documentname.Void PrintNameOf();/Printname.;Document:Document(char*name)Name=newcharstrlen(name)+1;strcpy(Name,name);void Document:PrintNameOf()coutNameendl;classBook:publicDocumentpublic:Book(char*name,longpagecount);voidPrintNameOf();private:longPageCount;Book:Book(char*name,longpagecount):Document(name)PageCount=pagecount;void Book:PrintNameOf()coutNameofbook:;Document:PrintNameOf();void main()Documenta(Document1);Bookb(Book1,100);b.PrintNameOf();程序运行输出:Nameofbook:Book17-11定义一个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员函数fn1()、fn2(),DerivedClass也有成员函数fn1()、fn2(),在主程序中定义一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fn1()、fn2(),观察运行结果。解:#includeclass BaseClasspublic:void fn1();void fn2();void BaseClass:fn1()cout调用基类的函数fn1()endl;void BaseClass:fn2()cout调用基类的函数fn2()endl;class DerivedClass:publicBaseClasspublic:voidfn1();voidfn2();void DerivedClass:fn1()cout调用派生类的函数fn1()endl;void DerivedClass:fn2()cout调用派生类的函数fn2()fn1();pBaseClass-fn2();pDerivedClass-fn1();pDerivedClass-fn2();程序运行输出:调用派生类的函数fn1()调用派生类的函数fn2()调用基类的函数fn1()调用基类的函数fn2()调用派生类的函数fn1()调用派生类的函数fn2()第六章6-15 const int * p1 和 int * const p2的区别是什么?解: const int * p1 声明了一个指向整型常量的指针p1,因此不能通过指针p1来改变它所指向的整型值;int * const p2声明了一个指针型常量,用于存放整型变量的地址,这个指针一旦初始化后,就不能被重新赋值了。6-20 实现一个名为SimpleCircle的简单圆类,其数据成员int *itsRadius为一个指向其半径值的指针,设计对数据成员的各种操作,给出这个类的完整实现并测试这个类。解: 源程序:#include class SimpleCirclepublic:SimpleCircle();SimpleCircle(int);SimpleCircle(const SimpleCircle &);SimpleCircle() void SetRadius(int);int GetRadius()const;private:int *itsRadius;SimpleCircle:SimpleCircle()itsRadius = new int(5);SimpleCircle:SimpleCircle(int radius)itsRadius = new int(radius);SimpleCircle:SimpleCircle(const SimpleCircle & rhs)int val = rhs.GetRadius();itsRadius = new int(val);int SimpleCircle:GetRadius() constreturn *itsRadius;int main()SimpleCircle CircleOne, CircleTwo(9);cout CircleOne: CircleOne.GetRadius() endl;cout CircleTwo: CircleTwo.GetRadius() endl;return 0;程序运行输出:CircleOne: 5CircleTwo: 9第五章5-3 下面的程序的运行结果是什么,实际运行一下,看看与你的设想有何不同。#include void myFunction(); int x = 5, y = 7; int main()cout x from main: x n;cout y from main: y nn;myFunction();cout Back from myFunction!nn;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 myFunction: y nn;解: 程序运行输出:x from main: 5y from main: 7x from myFunction: 5y from myFunction: 10Back from myFunction!x from main: 5y from main: 75-7 定义一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany(),存取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。解: 源程序:#include class Catpublic:Cat(int age):itsAge(age)HowManyCats+; virtual Cat() HowManyCats-; virtual int GetAge() return itsAge; virtual void SetAge(int age) itsAge = age; static int GetHowMany() return HowManyCats; private:int itsAge;static int HowManyCats;int Cat:HowManyCats = 0;void TelepathicFunction();int main()const int MaxCa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论