一、单选 1.C 2.D 3.D 4.C 5.B 6.D 7.A 8.C 9.B 10.D
二、多选 1. ABC 2. ACD 3. ABD 4. AC 5. BCD
三、判断对错 1. 对 2. 错 如可有两个成员函数,int f();和 int f() const; 3. 错 是否真正内联,由编译器决定。如函数是递归函数,那么永远不会内联。 4. 对 5. 错 可通过类的静态成员函数创建实例,如单件模式。 6. 对 7. 错 如可通过继承自基类的成员函数访问基类中的x. 8. 错 友员关系不具有传递性。 9. 对 10.对
四、写结果。 目的是考察虚函数的调用,包括普通成员函数中调用其它虚函数和 在构造、析构函数中只会调用虚函数的本地版本。
五、写结果。 是一个使用Handle类进行引用计数的例子。
六、回答问题 1. 重点是基类中的任何Private在派生类中都是不可访问的。 2. 可在A类中定义一个构造函数:A(const B&); 或在B类中定义一个自动转换函数: operator A( ) const; 3. 只有纯虚函数、非静态的成员函数可以是常量成员函数。 (这题有点问题,析构函数可以是纯虚函数,但不能是常量函数) 4. 如类A中有函数 int f(void);和int f(int);为重载(overload) (同名,参数不同) 如类A中有函数 int f(void);,A的派生类B中给int f(void)一个新的实现体,为redefine 如类A中有虚函数 virtual int f(void);,A的派生类B中给virtual int f(void)一个新的实现体, 为override. 5. A(const A& one ).当调用此拷贝构造函数时,需将参数压栈,若不使用&,就需要在 栈内创建一个one的副本,而这需要用拷贝构造函数。这样就会形成递归调用。 使用const,还允许用一个常量对象作为样本,来构造一个新的对象。 6. 计算子表达式的顺序由编译器决定的,虽然参数的压栈顺序在给定的调用方式下式固定的, 但参数表达式的计算顺序也由编译器决定的。不同的编译器或不同的表达式计算的顺序可能 不一致。
七. 1. 添加全局函数 bool operator>(const A& one, const A& two) { return one.GetData()>two.GetData(); } 2. 不行。 return (one>two?one:two); 时,不能将常量赋给变量。 3. 需要将ABC三个类的析构函数改为虚的。
八. Card类(不用enum,只用数字也可以)
main函数略
//enum前加上const就可将下面所有的都放入.h中。 const enum SUIT {SPADE=0,HEART,DIAMOND,CLUB}; const enum RANK {TWO=0,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE}; class Card { public: Card(int id):mID(id),mSuit((id-1)/13),mRank((id-1)%13){} bool IsSameSuit(const Card& rhs) { return ((this==&rhs)?false:mSuit==rhs.mSuit);} bool IsSameRank(const Card& rhs) { return ((this==&rhs)?false:mRank==rhs.mRank); } bool IsSuit(int suit) {return mSuit==suit;} bool IsRank(int rank) {return mRank==rank;} private: static int nBackImg; //背面图案 const int mID; const int mSuit; const int mRank; };
九. 1) class M { public: 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=GetNextPrime(a2); a3=GetNextPrime(a3); a4=GetNextPrime(a4); } private: int a1,a2,a3,a4; };
2)(因没有讲授设计模式部分,可以采用变通的方法,例如) class M { public: 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; a2=a3; a3=temp; M* p=p2; p2=p3; p3=p; if (p2) p2->Turn(); if (p3) p3->Turn(); } void Trans( ) { a1=GetNextPrime(a1); if (p2) p2->Trans(); else a2=GetNextPrime(a2);
if (p3) p3->Trans(); else a3=GetNextPrime(a3); a4=GetNextPrime(a4); } private: int a1,a2,a3,a4; M* p2; M* p3; };

|