return0;
}
在该程序中,将TPoint类的带有两个参数的构造函数进行修改,在函数体内增添下述语句:
cout<<"Contructoriscalled.\n"
(1)写出程序的输出结果,并解释输出结果。
(2)按下列要求进行调试;
在主函数体内,添加下列说明语句:
Tpointp4,p5
(2);
调试程序会出现什么现象?
为什么?
如何解决?
(提示:
对已有的构造函数进行适当修改)结合运行结果分析如何使用不同的构造函数创建不同的对象。
3.对教材中Li3_11.cpp的主函数做如下修改:
(1)将Heapclass*pa1,*pa2改为Heapclass*pa1,*pa2,*p3;
(2)在语句pa=newheapclass;后增加语句pa3=newHeapclass(5);
(3)将语句if(!
pa1||!
pa2)改为if(!
pa1||!
pa2||!
pa3);
(4)在语句deletepa2;后增加语句deletepa3;
写出程序的输出结果,并解释输出结果。
4.请定义一个矩形类(Rectangle),私有数据成员为矩形的长度(len)和宽度(wid),无参构造函数置len和wid为0,有参构造函数置len和wid为对应形参的值,另外还包括求矩形周长,求矩形面积,取矩形长度和宽度,修改矩形长度和宽度为对应形参的值,输出矩形尺寸等公有成员函数。
要求输出矩形尺寸的格式为”length:
长度,width:
宽度”。
(sy3_3.cpp)
5调试下列程序,写出输出结果,并分析输出结果。
//sy4_1.cpp
#include
usingnamespacestd;
classMy
{
public:
My(intaa)
{
A=aa;
B-=aa;
}
staticvoidfun(Mym);
private:
intA;
staticintB;
};
voidMy:
:
fun(Mym)
{
cout<<"A="<cout<<"B="<}
intMy:
:
B=100;
intmain()
{
MyP(6),Q(8);
My:
:
fun(P);
Q.fun(Q);
return0;
}
6.分析并调试程序,完成下列问题。
//sy4_2.cpp
#include
#include
usingnamespacestd;
classMy
{
public:
My(doublei=0){x=y=i;}
My(doublei,doublej){x=i;y=j;}
My(My&m){x=m.x;y=m.y;}
frienddoubledist(My&a,My&b);
private:
doublex,y;
};
doubledist(My&a,My&b)
{
doubledx=a.x-b.x;
doubledy=a.y-b.y;
returnsqrt(dx*dx+dy*dy);
}
intmain()
{
Mym1,m2(15),m3(13,14);
Mym4(m3);
cout<<"Thedistancel:
"<cout<<"Thedistance2:
"<cout<<"Thedistance3:
"<cout<<"Thedistance4:
"<return0;
}
(1)指出所有的构造函数,它们在本程序中分别起什么作用?
(2)指出设置默认参数的构造函数。
(3)指出友元函数,将友元函数放到私有部分,观察结果是否有变化。
(4)写出输出结果,并分析输出结果。
7.定义一个Student类,在该类的定义中包含一个数据成员score(分数),两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(floats)用于设置分数,求总分和累计学生人数;静态成员函数sun()用于返回总分;静态成员函数average()用于求平均值。
在main函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分(sy4_3)
8.声明Book和Ruler两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算两者的重量和。
(sy4_4.cpp)
三、实验环境
微机及VisualC++6.0。
四、算法描述及实验步骤
1.将cout<2.在该程序中,将TPoint类的带有两个参数的构造函数进行修改,在函数体内增添下述语句:
cout<<”Contructoriscalled.\n”
(1)写出程序的输出结果,并解释输出结果。
(2)按下列要求进行调试;
在主函数体内,添加下列说明语句:
Tpointp4,p5
(2);
观察调试时出现的现象,解释原因并解决
3.写出修改后的程序的结果,并解释输出结果
修改后的程序:
#include
usingnamespacestd;
classHeapclass
{
public:
Heapclass(intx);
Heapclass();
~Heapclass();
private:
inti;
};
Heapclass:
:
Heapclass(intx)
{
i=x;
cout<<"Contstructoriscalled."<
}
Heapclass:
:
Heapclass()
{
cout<<"DefaultContstructoriscalled."<}
Heapclass:
:
~Heapclass()
{
cout<<"Defaultiscalled."<}
intmain()
{
Heapclass*pa1,*pa2,*pa3;
pa1=newHeapclass(4);
pa2=newHeapclass;
pa3=newHeapclass(5);
if(!
pa1||!
pa2||!
pa3)
{
cout<<"OutofMemory!
"<return0;
}
cout<<"Exitmain"<deletepa1;
deletepa2;
deletepa3;
return0;
}
4#include
usingnamespacestd;
classRectangle
{
public:
Rectangle(){len=0;wid=0;}
Rectangle(doubleLen,doubleWid){len=Len;wid=Wid;}
doubleCircumference(){return2*(len+wid);}
doubleArea(){returnlen*wid;}
doublegetl(){returnlen;}
doublegetw(){returnwid;}
voidcharge(doublea,doubleb){len=a;wid=b;}
print(){cout<<"length:
"<"<private:
intlen,wid;
};
intmain()
{
Rectanglep1;
Rectanglep2(4.0,5.0);
cout<<"p1的矩形尺寸:
";
p1.print();
cout<<"p2的矩形尺寸:
";
p2.print();
cout<<"p2周长:
"<cout<<"p2面积:
"<cout<<"p2的长度:
"<cout<<"p2的宽度:
"<p2.charge(5.0,6.0);
cout<<"修改后的矩形的尺寸:
";
p2.print();
return0;
}
5.调试程序所有sy4_1,写出输出结果,分析输出结果。
6.分析调试sy4_2,回答sy4_2的问题。
7.
程序如下:
//sy4_3
#include
usingnamespacestd;
classstudent
{
public:
voidscoretotalcount(floats);
staticfloatsum();
staticfloataverage();
private:
floatscore;
staticfloattotal;
staticintcount;
};
floatstudent:
:
total=0;
intstudent:
:
count=0;
voidstudent:
:
scoretotalcount(floats)
{
score=s;
total+=score;
count++;
}
floatstudent:
:
sum(){returntotal;}
floatstudent:
:
average(){returntotal/count;}
intmain()
{
floats;
intn;
studenta[10];
cout<<"输入学生的个数(10个以内):
";
cin>>n;
cout<<"输入学生成绩:
";
for(inti(0);i{
cin>>s;
a[i].scoretotalcount(s);
}
cout<<"班级总分为:
";
cout<:
sum()<cout<<"班级平均分为:
";
cout<:
average()<return0;
}
8.程序如下:
//sy4_4
#include
usingnamespacestd;
classRuler;
classBook
{
public:
Book(inti=0){weight=i;}
friendfloattotalWeight(Book&m,Ruler&n);
private:
floatweight;
};
classRuler
{
public:
Ruler(intj=0){weight=j;}
friendfloattotalWeight(Book&m,Ruler&n);
private:
floatweight;
};
floattotalWeight(Book&m,Ruler&n)
{returnm.weight+n.weight;}
intmain()
{inti,j;
cout<<"Bookweight:
";
cin>>i;
cout<<"Rulerweight:
";
cin>>j;
BookB(i);
RulerR(j);
cout<<"totalweight"<return0;
五、调试过程及实验结果
1.应将cout<试验结果为:
2.
(1)在TPoint类的带有两个参数的构造函数中添加cout<<”Contructoriscalled.\n”
试验结果:
(2)在主函数体内,添加Tpointp4,p5
(2);
调试过程:
出错原因:
因为在类中没有定义不带参数和带一个参数的构造函数
解决方法:
可以将带两个参数的结构函数改为缺省的构造函数,即可以将TPoint(intx,inty)改为TPoint(intx=0,inty=0)
输出结果:
在运行的过程中TPointp1(4,9);TPointp4,p5
(2);调用了构造函数,而TPointp2(p1);TPointp3=p2;使用了拷贝构造函数。
3.实验结果:
用3个指针*p1,*p2,*p3指向三个新创建的对象,并调用了带一个和不带构造参数的构造函数进行对对象进行初始化,故输出了前三个语句。
实验结束后,调用了析构函数,产生了后三个语句。
4.实验结果:
调试过程:
经检查charge(5.0,6.0);错误应将其改为p2.charge(5.0,6.0);
5.实验结果:
创建对象P时,调用构造函数对其初始化得到,A=6,B=B-A=100-6=94,
再创建对象Q时,调用构造函数对其初始化得到,A=8,B=B-A=94-8=86,
最后调用了静态成员函数staticvoidfun(),且因为B是静态数据成员,故输出上面的结果。
6.验结果:
(1)构造函数My(doublei=0)用来对m1,m2进行初始化,My(doublei,doublej)对m3进行初始化,拷贝构造函数My(My&m)用来对m4进行初始化。
(2)My(doublei=0)为带默认参数的构造函数。
(3)dist()为友元函数,将其放到私有部分,编译仍是正确的的,因为友元函数声明时仍与普通函数一致的,所以编译时不会出错。
7.调试过程:
在类定义完时,未加分号。
实验结果:
8.调试过程:
调试未出现错误。
实验结果:
六、总结
(1)只有类中的函数才能访问类中的私有成员。
(2)在对象创建时,先用构造函数对其进行初始化,在程序结束后用析构函数释放由构造函数分配的内存,而且析构函数的执行顺序与构造函数执行的顺序刚好相反。
(3)一般对象:
在对象的创建时进行初始化,可以用构造函数或者用拷贝构造函数进行初始化
堆对象:
用new进行分配空间,在调用构造函数进行初始化。
(4)掌握了静态变量和静态函数的基本使用和友元函数的使用方法。