}
1)(4分)请在不改变上述已有代码的条件下,添加必要的函数使得程序可以编译通过和运行,并输出结果2和5。
其中比较对象时只比较各自的或在派生类定义的数据成员,如比较类B的对象b和类C的对象c时,实际比较的是b.y和c.z。
2)(2分)若不改变函数max2的函数体,只将函数声明改成A&max2(constA&one,constA&two),请问这样行吗?
为什么?
3)(2分)若main中有语句A*p=newC(1,2,3);和deletep;,那么类A、类B和类C应做何修改?
八、(共10分)现考虑编写一个扑克游戏:
只用一付无大小王的扑克,扑克的花色(suit)分为Spade、Heart、Diamond和Club,每门花色的牌共13张,面值(rank)分别为2、3、4、5、6、7、8、9、10、Jack、Queen、King和Ace,每张扑克牌应包含如下信息:
唯一的ID号(1-52)、花色、面值、背面图案的编号等。
每张扑克牌的操作有:
判断两张扑克牌是相同花色吗?
相同面值吗?
判断一张扑克牌是给定的花色吗?
是给定的面值吗?
请写出扑克牌类Card类的声明和实现代码,要求选取适当形式的数据成员描述每张扑克牌的信息,同时以成员函数的形式实现指定的操作。
九、(共12分)现有一个2x2的矩阵,其第一行元素从左到右依次为a1和a2,第二行元素从左到右依次为a3和a4,简记此矩阵为M(a1,a2,a3,a4)。
对矩阵M可进行两种操作:
一种是转置,即交换a2和a3的位置;另一种是变换,即将矩阵M(a1,a2,a3,a4)变换为M(b1,b2,b3,b4),其中bi是变换ai后的结果。
假定已有全局函数intGetNextPrime(intdata);它返回比data大的最小素数,若返回值越界则返回2。
不用考虑模板,请按下列具体要求实现代码。
1)(6分)若ai都是整数,每次变换都将ai变换成比ai大的最小素数(i=1,2,3,4)。
请用类M描述满足上述条件的矩阵,要求给出类M的声明和实现代码,同时写出main函数,并在其中创建一个M(1,10,100,1000)矩阵。
2)(6分)若矩阵中元素a2和a3既可以是整数,也可以是另一个满足此定义的矩阵,例如:
矩阵M(1,M(2,3,M(4,5,6,7),,9,10)。
矩阵转置时,既要交换a2和a3的位置,还要对a2和a3中的矩阵进行转置;矩阵变换时,同样也要对其中的矩阵元素进行变换。
请给出满足此要求的矩阵类M的声明和实现代码。
一、单选
1.C2.D3.D4.C5.B6.D7.A8.C9.B10.D
二、多选
1.ABC
2.ACD
3.ABD
4.AC
5.BCD
三、判断对错
1.对
2.错如可有两个成员函数,intf();和intf()const;
3.错是否真正内联,由编译器决定。
如函数是递归函数,那么永远不会内联。
4.对
5.错可通过类的静态成员函数创建实例,如单件模式。
6.对
7.错如可通过继承自基类的成员函数访问基类中的x.
8.错友员关系不具有传递性。
9.对
10.对
四、写结果。
目的是考察虚函数的调用,包括普通成员函数中调用其它虚函数和
在构造、析构函数中只会调用虚函数的本地版本。
五、写结果。
是一个使用Handle类进行引用计数的例子。
六、回答问题
1.重点是基类中的任何Private在派生类中都是不可访问的。
2.可在A类中定义一个构造函数:
A(constB&);
或在B类中定义一个自动转换函数:
operatorA()const;
3.只有纯虚函数、非静态的成员函数可以是常量成员函数。
(这题有点问题,析构函数可以是纯虚函数,但不能是常量函数)
4.如类A中有函数intf(void);和intf(int);为重载(overload)(同名,参数不同)
如类A中有函数intf(void);,A的派生类B中给intf(void)一个新的实现体,为redefine
如类A中有虚函数virtualintf(void);,A的派生类B中给virtualintf(void)一个新的实现体,
为override.
5.A(constA&one).当调用此拷贝构造函数时,需将参数压栈,若不使用&,就需要在
栈内创建一个one的副本,而这需要用拷贝构造函数。
这样就会形成递归调用。
使用const,还允许用一个常量对象作为样本,来构造一个新的对象。
6.计算子表达式的顺序由编译器决定的,虽然参数的压栈顺序在给定的调用方式下式固定的,
但参数表达式的计算顺序也由编译器决定的。
不同的编译器或不同的表达式计算的顺序可能
不一致。
七.
1.添加全局函数
booloperator>(constA&one,constA&two)
{
returnone.GetData()>two.GetData();
}
2.不行。
return(one>two?
one:
two);时,不能将常量赋给变量。
3.需要将ABC三个类的析构函数改为虚的。
八.Card类(不用enum,只用数字也可以)
main函数略
//enum前加上const就可将下面所有的都放入.h中。
constenumSUIT{SPADE=0,HEART,DIAMOND,CLUB};
constenumRANK{TWO=0,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE};
classCard
{
public:
Card(intid):
mID(id),mSuit((id-1)/13),mRank((id-1)%13){}
boolIsSameSuit(constCard&rhs)
{return((this==&rhs)?
false:
mSuit==rhs.mSuit);}
boolIsSameRank(constCard&rhs)
{return((this==&rhs)?
false:
mRank==rhs.mRank);}
boolIsSuit(intsuit)
{returnmSuit==suit;}
boolIsRank(intrank)
{returnmRank==rank;}
private:
staticintnBackImg;//背面图案
constintmID;
constintmSuit;
constintmRank;
};
九.
1)classM
{
public:
M(intv1,intv2,intv3,intv4):
a1(v1),a2(v2),a3(v3),a4(c4){}
voidTurn(){inttemp=a2;a2=a3;a3=temp;}
voidTrans(){
a1=GetNextPrime(a1);
a2=GetNextPrime(a2);
a3=GetNextPrime(a3);
a4=GetNextPrime(a4);
}
private:
inta1,a2,a3,a4;
};
2)(因没有讲授设计模式部分,可以采用变通的方法,例如)
classM
{
public:
M(intv1,intv2,intv3,intv4)
:
a1(v1),a2(v2),a3(v3),a4(v4),p2(0),p3(0){}
M(intv1,intv2,M*pt3,intv4)
:
a1(v1),a2(v2),a3(0),a4(v4),p2(0),p3(pt3){}
M(intv1,M*pt2,intv3,intv4)
:
a1(v1),a2(0),a3(v3),a4(v4),p2(pt2),p3(0){}
M(intv1,M*pt2,M*pt3,intv4)
:
a1(v1),a2(0),a3(0),a4(v4),p2(pt2),p3(pt3){}
voidTurn()
{
inttemp=a2;a2=a3;a3=temp;
M*p=p2;p2=p3;p3=p;
if(p2)p2->Turn();
if(p3)p3->Turn();
}
voidTrans(){
a1=GetNextPrime(a1);
if(p2)
p2->Trans();
else
a2=GetNextPrime(a2);
if(p3)
p3->Trans();
else
a3=GetNextPrime(a3);
a4=GetNextPrime(a4);
}
private:
inta1,a2,a3,a4;
M*p2;
M*p3;
};