1、C. 只要类B中的构造函数都是public的,在main函数中就可以创建类B的实例对象。D. 类A和类B中的同名虚函数的返回值类型必须完全一致。6. 下列哪种函数可以是虚的:A. 自定义的构造函数 B. 拷贝构造函数 C. 静态成员函数 D. 析构函数 7. 类A有一个实例化的常量对象a,那么下面的说法中不正确的是:A. 类A中的非静态数据成员一定都是常量成员。B. 通过a可以直接调用类A的常量成员函数。C. a不能直接作为左值表达式使用。D. a可以是静态常量对象。8. 在不考虑强制类型转换的情况下,关于类中常量成员函数的下列说法不正确的是:A. 常量成员函数中不能修改本类中的非静态数据成员
2、。B. 常量成员函数中可以调用本类中的任何静态成员函数。C. 常量成员函数的返回值只能是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
3、. 类A中声明成员函数 B func( B& obj);二、(共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&
4、) const; C.const A * f(const int ); D. A f( const int&3. 关于类中重载赋值运算符的正确说法是:A. 由编译器提供的缺省赋值函数具有public访问性并且执行按位赋值。B. 在重载派生类的赋值操作时,不但要实现派生类中数据成员的赋值,还要负责基类中数据成员的赋值。C. 只有在类中含有指针数据成员或引用数据成员时,才需要重载类的赋值操作。D. 通过修改类A的声明或定义,可以禁止用户在类A对象间进行任何赋值操作。4. 在类的静态成员函数的实现体中,可以访问或调用:A. 本类中的静态数据成员 B. 本类中非静态的常量数据成员 C. 本类中其它的静
5、态成员函数 D. 本类中非静态的成员函数 5. 关于异常和C+提供的异常处理机制正确的说法是:A. 若程序员预见到程序中的异常,则一定可以通过修改程序代码来避免异常出现。B. 使用dynamic_cast操作符可能会产生异常。C. 异常可以用catch进行捕获处理。D. 异常可以是对象,也可以是普通整数。三、(共20分,每题2分)判断正误,对于你认为错误的论述,说明原因或举出反例。1. 函数体内声明的静态变量,至多只会被初始化一次。2. 对于同一个类中的两个非静态成员函数,它们的函数的名称、参数类型、参数个数、参数顺序以及返回值的类型不能完全相同。3. inline函数表示编译器一定会将函数体
6、直接插入到调用此函数的地方,这样可以加快程序的运行速度。4. 每个cpp文件是单独编译的,但一个程序中多个cpp文件的编译顺序是不固定的。5. 将类A所有构造函数的可访问性都限制为私有的,那么在main函数中不可能得到类A的实例对象。6. 名字空间是可以多层嵌套的;对于类A中的函数成员和数据成员,它们都属于类名A代表的一层名字空间。7. 若在类Base和派生类Derived中,分别声明一个同名的整型成员变量int x; ,那么通过Derived类的实例对象,不可能输出基类Base中的变量x的值。8. 若类A是类B的友员类,且类B是类C的友员类,那么类A也是类C的友员类。9. 虽然抽象类的析构函
7、数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。10. 构造函数的初始化列表中的内容,不会影响构造对象中成员数据的初始化顺序。四、(5分)写出下面程序的运行结果 #include class A public:A(int v1)(v1) f( ); virtual A( ) f( );virtual void f( ) +count; x+=10;Show( ); virtual void Show ( ) const coutcount=count x=xendl;protected:static int count;private:int x;class B
8、:public A B(int v1,int v2):A(v1),y(v2) f( );virtual B( ) f( );y+=50; Show ( ); y=yf( );delete p;return 0;五、(5分)写出下面程序的运行结果 friend class B;A(int val=0):data(val),use(1) int use, data;class B B(int val=0):pa(new A(val) B( ) if(-pa-use=0) delete pa;B(const B& rhs) +rhs-use;pa=rhs.pa;B& operator=(const
9、B& rhs);A* operator-( ) const return pa;void Display( ) const coutdata use=use+rhs-return *this;int main() B b1(1),b2(b1),b3(3);b1.Display();b2.Display();b3.Display();b3=b1;六、(共20分)回答下列各题 1. 说明类中的public、 protected和 private成员函数分别在public、protected和private继承方式下在派生类中的可访问性。(4分) 2. 若类A和类B没有继承关系,对于函数void f
10、unc(A&) ,请至少用两种不同方法说明如何才能传递一个非常量的B类对象给func函数。3. 在声明类中的构造函数、析构函数、纯虚函数、静态成员函数、非静态的成员函数以及全局函数作为类的友元函数时,哪些可以是常量成员函数?(3分) 4. 举例说明重载(overload) 、重定义(redefine) 和重写(override)的含义。5. 通常类A的拷贝构造函数的原型写为A(const A&);,请问为什么参数一定要使用引用形式?使用const修饰符除了可以防止修改传递给构造函数的实参外,还有什么作用?6. 程序员规范中要求不要写出类似(+i)+(i+) 或 f(+i,i+)这样的代码,请说
11、明原因。七、(共8分)阅读下面部分程序代码,完成3个问题。 A(int v1)(v1) virtual int GetData( ) const return x; int x; B(int v1,int v2):A(v1),y(v2) virtual int GetData( ) const return y; int y;class C:public B C(int v1,int v2,int v3):B(v1,v2),z(v3) virtual int GetData( ) const return z; int z;const A& max2(const A& one,const A&
12、 two) return (onetwo?one:two);void main() B b(1,2); C c(100,10,1);coutmax2(b,c).GetData( )max2(b,5).GetData( )(const A& one, const A&return one.GetData()two.GetData();2. 不行。 return (one 时,不能将常量赋给变量。3. 需要将ABC三个类的析构函数改为虚的。八. Card类(不用enum,只用数字也可以) main函数略 /enum前加上const就可将下面所有的都放入.h中。const enum SUIT SPA
13、DE=0,HEART,DIAMOND,CLUB;const enum RANK TWO=0,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE;class Card Card(int id):mID(id),mSuit(id-1)/13),mRank(id-1)%13) bool IsSameSuit(const Card& return (this=&rhs)?false:mSuit=rhs.mSuit);bool IsSameRank(const Card&mRank=rhs.mRank);bool IsSuit(int
14、 suit) return mSuit=suit;bool IsRank(int rank) return mRank=rank;static int nBackImg; /背面图案 const int mID;const int mSuit;const int mRank;九. 1) class M M(int v1,int v2,int v3,int v4):a1(v1),a2(v2),a3(v3),a4(c4) void Turn( ) int temp=a2; a2=a3; a3=temp;void Trans( ) a1=GetNextPrime(a1);a2=GetNextPrim
15、e(a2);a3=GetNextPrime(a3);a4=GetNextPrime(a4);int a1,a2,a3,a4;2)(因没有讲授设计模式部分,可以采用变通的方法,例如) class M M(int v1,int v2,int v3,int v4) a1(v1),a2(v2),a3(v3),a4(v4), p2(0),p3(0) M(int v1,int v2,M* pt3,int v4) a1(v1),a2(v2),a3(0),a4(v4),p2(0),p3(pt3) M(int v1,M* pt2,int v3,int v4) a1(v1),a2(0),a3(v3),a4(v4),p2(pt2),p3(0) M(int v1,M* pt2,M *pt3,int v4) a1(v1),a2(0),a3(0),a4(v4),p2(pt2),p3(pt3) void Turn( ) int temp=a2;M* p=p2; p2=p3; p3=p;if (p2) p2-Turn();if (p3) p3-if (p2) p2-Trans();else if (p3) p3-M* p2;M* p3;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1