}
实验三类与对象
一、实验目的:
1、掌握类与对象的声明和使用。
2、观察构造函数与析构函数的执行过程。
3、掌握具有不同访问属性的成员的访问方式。
4、使用DEBUG调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。
二、实验内容:
1、声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。
其中,rank为枚举类型CPU_Rank,声明为enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值,观察构造函数和析构函数的调用顺序。
2、声明一个简单的computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。
cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。
#include
usingnamespacestd;
classCPU
{
public:
voidrun_cpu();
voidstop_cpu();
CPU(intfre,doublevol);
CPU();
~CPU();
CPU(CPU&p);
private:
intfre_cpu;
doublevol_cpu;
};
classRAM
{
public:
voidrun_ram();
voidstop_ram();
RAM(intfre,doublevol);
RAM();
~RAM();
RAM(RAM&p);
private:
intfre_ram;
doublevol_ram;
};
classCUMPUTER
{
friendclassCPU;
friendclassRAM;
public:
voidrun_cum();
voidstop_cum();
CUMPUTER();
CUMPUTER(CPUc,RAMr);
CUMPUTER(CUMPUTER&c);
~CUMPUTER();
private:
CPUcpu;
RAMram;
};
voidCPU:
:
run_cpu()
{
cout<<"CPU运行"<cout<}
voidCPU:
:
stop_cpu()
{
cout<<"CPU停止"<}
CPU:
:
CPU()
{
fre_cpu=0;
vol_cpu=0;
cout<<"CPU缺省样式构造函数调用完成"<}
CPU:
:
CPU(intfre,doublevol)
{
fre_cpu=fre;vol_cpu=vol;
cout<<"CPU构造函数调用完成"<}
CPU:
:
~CPU()
{
cout<<"CPU析构函数调用完成"<}
CPU:
:
CPU(CPU&p)
{
fre_cpu=p.fre_cpu;
vol_cpu=p.vol_cpu;
cout<<"CPU拷贝构造函数调用完成"<}
voidRAM:
:
run_ram()
{
cout<<"RAM运行"<cout<}
voidRAM:
:
stop_ram()
{
cout<<"RAM停止"<RAM:
:
RAM()
{
fre_ram=0;
vol_ram=0;
cout<<"RAM缺省样式构造函数调用完成"<}
RAM:
:
RAM(intfre,doublevol)
{
fre_ram=fre;
vol_ram=vol;
cout<<"RAM构造函数调用完成"<}
RAM:
:
~RAM()
{
cout<<"RAM析构函数调用完成"<}
RAM:
:
RAM(RAM&p)
{
fre_ram=p.fre_ram;
vol_ram=p.vol_ram;
cout<<"RAM拷贝构造函数调用完成"<}
voidCUMPUTER:
:
run_cum()
{
cout<<"cumputer运行"<cpu.run_cpu();ram.run_ram();}
voidCUMPUTER:
:
stop_cum()
{
cout<<"cumputer停止"<cpu.stop_cpu();ram.stop_ram();
}
CUMPUTER:
:
CUMPUTER(CPUc,RAMr):
cpu(c),ram(r)
{
cout<<"CUMPUTER构造函数调用完成"<}
CUMPUTER:
:
CUMPUTER(CUMPUTER&c)
{
cpu=c.cpu;ram=c.ram;
cout<<"CUMPUTER拷贝构造函数调用完成"<}
CUMPUTER:
:
~CUMPUTER()
{
cout<<"CUMPUTER析构函数调用完成"<}
intmain()
{
CPUc1(1,5.5);
CPUc2=c1;
RAMr1(3,8.8);
RAMr2=r1;
CUMPUTERcum1(c1,r1);
CUMPUTERcum2=cum1;
c2.run_cpu();
r2.run_ram();
cum1.run_cum();
cum1.stop_cum();
cum2.run_cum();
cum2.stop_cum();
system("pause");
}
实验四C++程序结构
一、实验目的:
1、观察程序运行时变量的作用域、生存期和可见性。
2、掌握类的静态成员的使用。
3、学习多文件结构在C++程序中的使用。
二、实验内容:
1、运行下面的程序,观察变量x、y的值。
#include
usingnamespacestd;
voidfn1();
intx=1,y=2;
intmain()
{
cout<<"Begin..."<cout<<"x="<cout<<"y="<cout<<"Evaluatexandyinmain()..."<intx=10,y=20;
cout<<"x="<cout<<"y="<cout<<"Stepintofn1()..."<fn1();
cout<<"Backinmain"<cout<<"x="<cout<<"y="<return0;
}
voidfn1()
{
inty=200;
cout<<"x="<cout<<"y="<}
2、实现客户机(CLIENT)类。
声明字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。
在头文件client.h中声明类,在文件client.cpp中实现,在文件test.cpp中测试这个类,观察相应的成员变量取值的变化情况。
#include
usingnamespacestd;
classClient
{
private:
staticcharServerName[10];
staticintClientNum;
public:
Client();
~Client();
static
voidChangeServerName();
voidshow();
};
intClient:
:
ClientNum=0;
charClient:
:
ServerName[10]="abcd";
voidClient:
:
show()
{
cout<<"服务器名称是:
";
cout<cout<<"客户数量是:
";
cout<cout<}
voidClient:
:
ChangeServerName()
{
cout<<"请输入服务器名称:
";
cin>>ServerName;
}
Client:
:
Client()
{
cout<<"客户已记录"<ClientNum++;
}
Client:
:
~Client()
{
cout<<""<ClientNum--;
}
intmain()
{
Client:
:
ChangeServerName();
Clienta;
a.show();
Client:
:
ChangeServerName();
Clientb;
b.show();
Client:
:
ChangeServerName();
Clientc;
c.show();
system("pause");
}
实验五数组、指针与字符串
一、实验目的:
1、学习使用数组数据对象及字符串的组织与处理。
2、学习使用标准C++库。
3、掌握指针的使用方法,并通过DEBUG观察指针内容及其所指的对象的内容。
4、练习通过动态内存分配实现动态数组,并体会指针在其中的作用。
二、实验内容:
1、编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。
#include
usingnamespacestd;
voidmain()
{
intJuZheng[3][3]={11,44,98,36,45,82,48,91,64};
inti,j;
intNew[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
New[j][i]=JuZheng[i][j];
}
cout<<"原矩阵是:
"<for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout<cout<}
cout<<"转置后矩阵是:
"<for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout<cout<}
}
2、使用动态内存分配生成动态数组来重新完成上题。
#include
usingnamespacestd;
intmain()
{
inttemp;
int**a;
a=newint*[3];
cout<<"输入数组元素:
"<for(inti=0;i<3;i++)
if((a[i]=newint[3])==NULL)
exit(0);
for(i=0;i<3;i++)
{
for(intj=0;j<3;j++)
cin>>a[i][j];
}
//输出原数组
cout<<"原数组:
"<for(i=0;i<3;i++)
{
for(intj=0;j<3;j++)
cout<<""<cout<}
for(i=0;i<3;i++)
{
for(intj=i;j<3;j++)
{
temp=a[j][i];
a[j][i]=a[i][j];
a[i][j]=temp;
}
}
cout<<"转置后数组:
"<for(i=0;i<3;i++)
{
for(intj=0;j<3;j++)
cout<<""<cout<}
}
3、编程实现两字符串的连接。
要求使用字符数组保存字符串,不允许使用系统函数。
#include
usingnamespacestd;
intmain()
{
charstr1[40];
charstr2[20];
inti=0,j=0;
cout<<"请输入第一个字符串:
";
cin>>str1;
cout<<"请输入第二个字符串:
";
cin>>str2;
while(str1[i]!
='\0')
i++;
while(str2[j]!
='\0')
{
str1[i]=str2[j];
i++;
j++;
}
str1[i]='\0';
cout<<"连接后的字符串:
"<}
4、使用string类声明字符串对象,重新实现上一小题。
#include
#include
usingnamespacestd;
intmain()
{
strings1;
strings2;
cout<<"请输入第一个字符串:
";
cin>>s1;
cout<<"请输入第二个字符串:
";
cin>>s2;
s1+=s2;
cout<<"连接后的字符串为:
"<return0;
}
实验六继承与派生
一、实验目的:
1、学习声明和使用类的继承关系,声明派生类。
2、熟悉不同继承方式下对基类成员的访问控制。
3、学习利用虚基类解决二义性问题。
二、实验内容:
1、定义一个基类Animal,有私有数据成员变量age,构造其派生类dog,在其成员函数setAge(intn)中直接给Age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?
编程测试一下。
#include
usingnamespacestd;
classAnimal
{
public:
intage;
};
classDog:
publicAnimal
{
public:
SetAge(intn)
{
age=n;
cout<<"年纪是:
"<}
};
voidmain()
{
Dogdog;
dog.SetAge(5);
}
2、定义一个基类BaseClass,有整型成员变量Number,构造其派生类DerivedClass,观察构造函数的析构函数的执行情况。
#include
usingnamespacestd;
classBassClass
{
private:
intNumber;
public:
BassClass();
BassClass(intnum);
~BassClass();
voidGetNum()
{
cout<<"Thenumberis"<}
};
classDerivedClass:
publicBassClass
{
public:
DerivedClass():
BassClass()
{
cout<<"缺省样式构造函数调用完成"<}
DerivedClass(intnum):
BassClass(num)
{cout<<"带参数构造函数调用完成"<};
~DerivedClass()
{
cout<<"析构函数调用完成"<}
voidGetNumner()
{
GetNum();
}
};
BassClass:
:
BassClass()
{
Number=1;
cout<<"缺省样式构造函数调用完成"<}
BassClass:
:
BassClass(intnum)