一、单选
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;
};