return0;
}
voidswap(int&x,int&y)
{
intt=x;
x=y;
y=t;
}
3)定义一个CPU类,包含等级(Rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。
其中,rank为枚举类型CPU__Rank,定义为enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值。
观察构造函数和析构函数的调用顺序。
#include
usingnamespacestd;
classCPU
{
public:
CPU()
{
cout<<"startworking"<}
~CPU()
{
cout<<"finishworking"<}
voidrun(longf,floatv);
voidstop();
private:
longfrequency;
floatvoltage;
enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};
};
voidCPU:
:
run(longf,floatv)
{
intm;
frequency=f;
voltage=v;
cin>>m;
switch(m)
{
case1:
cout<case2:
cout<case3:
cout<case4:
cout<case5:
cout<case6:
cout<case7:
cout<}
cout<cout<}
voidCPU:
:
stop()
{
frequency=0;
voltage=0;
}
intmain()
{
CPUc;
c.run(2300,254.7);
c.stop();
return0;
}
4)定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。
cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类,为以上的类编写构造和析构函数,观察组合类和内嵌类的构造函数和析构函数的调用顺序。
#include
usingnamespacestd;
classRAM
{
public:
RAM(intw)
{
a=w;
cout<<"thereisram"<}
~RAM()
{
cout<<"thereisnoram"<}
private:
inta;
};
classCDROM
{
public:
CDROM(intn)
{
b=n;
cout<<"thereiscdrom"<}
~CDROM()
{
cout<<"thereisnocdrom"<}
private:
intb;
};
classCPU
{
public:
CPU(intm)
{
c=m;
cout<<"thereiscpu"<}
~CPU()
{
cout<<"thereisnocpu"<}
private:
intc;
};
classComputer
{
public:
Computer(CPUcpu1,RAMram1,CDROMcdrom1);
~Computer()
{
cout<<"nocomputer"<}
voidrun()
{}
voidstop()
{}
private:
RAMram;
CDROMcdrom;
CPUcpu;
};
Computer:
:
Computer(CPUcpu1,RAMram1,CDROMcdrom1):
cpu(cpu1),ram(ram1),cdrom(cdrom1)
{
cout<<"constructorofcomputer"<}
intmain()
{
CPUcpu2
(1);
RAMram2
(2);
CDROMcdrom2(3);
Computercomputer(1,2,3);
return0;
}
5)为题目2)的类编写复制构造函数,在主函数中利用复制构造的方式创建新的对象,观察对象的状态。
#include
usingnamespacestd;
classpoint
{
public:
point(intxx=0,intyy=0)
{
x=xx;
y=yy;
}
intgetx()
{
returnx;
}
intgety()
{
returny;
}
point(point&p);
private:
intx,y;
};
point:
:
point(point&p)
{
x=p.x+3;
y=p.y+7;
}
intmain()
{
pointxp(2,3);
pointnewpoint(xp);
cout<cout<return0;
}
6)思考并回答以下概念:
函数重载,引用,类,对象,数据成员,函数成员,访问属性,构造函数,析构函数,类的组合,内嵌对象,初始化列表,复制构造函数。
3.主要仪器设备及软件:
PC+Windows2000+VC6.0
实验二C++程序的结构
(设计性实验2学时)
1.目的要求:
1)观察程序运行中变量的作用域、生存期和可见性;
2)学习类的静态成员的使用;
3)学习多文件结构在C++程序中的使用。
2.实验内容:
7)实现客户机(CLIENT)类。
定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。
#include
usingnamespacestd;
classCLIENT
{
public:
CLIENT(){ClientNum++;}
~CLIENT(){ClientNum--;}
staticvoidChangeServerName(charr);
intget(){returnClientNum;}
chargett(){returnServerName;}
private:
staticcharServerName;
staticintClientNum;
};
voidCLIENT:
:
ChangeServerName(charr)
{
ServerName=r;
}
intCLIENT:
:
ClientNum=0;
charCLIENT:
:
ServerName='A';
intmain()
{
CLIENTA;
charm;
cout<<"name=";
cin>>m;
CLIENT:
:
ChangeServerName(m);
cout<cout<CLIENTB;
cout<<"name=";
cin>>m;
CLIENT:
:
ChangeServerName(m);
cout<cout<return0;
}
8)利用多文件结构实现题目1),在头文件client.h中定义类,在文件client.cpp中实现该类,在文件test.cpp中测试这个类,观察相应的成员变量取值的变化情况,要求ClientNum能够实时记录客户机对象的数量。
/////////////////////////////////////////////client.h///////////////////
classCLIENT
{
public:
CLIENT(){ClientNum++;}
~CLIENT(){ClientNum--;}
staticvoidChangeServerName(charr);
intget(){returnClientNum;}
chargett(){returnServerName;}
private:
staticcharServerName;
staticintClientNum;
};
////////////////////////////////////////////////////client.cpp//////////////////////////
#include
#include"client.h"
usingnamespacestd;
voidCLIENT:
:
ChangeServerName(charr)
{
ServerName=r;
}
intCLIENT:
:
ClientNum=0;
charCLIENT:
:
ServerName='A';
//////////////////////////////main.cpp//////////////////////////
#include
#include"client.h"
usingnamespacestd;
intmain()
{
CLIENTA;
charm;
cout<<"name=";
cin>>m;
CLIENT:
:
ChangeServerName(m);
cout<cout<CLIENTB;
cout<<"name=";
cin>>m;
CLIENT:
:
ChangeServerName(m);
cout<cout<return0;
}
9)思考并回答以下概念:
类的静态数据成员,类的静态函数成员,多文件结构,文件包含。
3.主要仪器设备及软件:
Windows2000+VC6.0
实验三数组、指针与字符串实验
(设计性实验4学时)
1.目的要求:
1)学习使用数组;学习字符串数据的组织和处理;学习标准C++库的使用;
2)掌握指针的使用方法;练习通过debug观察指针的内容及其所指的对象的内容;练习通过动态内存分配实现动态数组,并体会指针在其中的作用;
3)分别使用字符数组和标准C++库练习处理字符串的方法。
2.实验内容:
10)编写一个类用于处理3×3矩阵转置,测试转置的效果,输出转置前后的矩阵。
#include
usingnamespacestd;
classJZ
{
public:
JZ(intm[3][3])
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=m[i][j];
}
voidzhuanzi()
{
inttemp;
for(i=0;i<3;i++)
for(j=0;j
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
voidshow()
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout<<""<cout<}
}
private:
inta[3][3];
inti,j;
};
intmain()
{
inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};
JZb(a);
b.show();
b.zhuanzi();
cout<b.show();
return0;
}
11)定义一个具有构造函数和析构函数的类,如实验一的CPU类,定义一个CPU的对象数组,观察构造函数的析构函数的调用过程。
#include
usingnamespacestd;
classCPU
{
public:
CPU()
{
cout<<"CPUiscreated!
"<}
~CPU()
{
cout<<"CPUisdestroyed!
"<}
};
intmain()
{
CPUcpu[3];
return0;
}
12)利用动态内存分配的方式重新完成题目2)。
13)使用系统提供的string类定义字符串对象并初始化,实现从原始字符串中提取一个子串。
#include
#include
usingnamespacestd;
intmain()
{
stringstr1="abcdefgh",str2;
unsignedintpos=0;
unsignedintn=0;
cout<<"pos=";
cin>>pos;
cout<<"n=";
cin>>n;
if(posstr2=str1.substr(pos,n);
cout<return0;
}
14)选做:
定义一个Point(二维点类)的对象数组,利用该数组实现直线的线性拟合。
15)选做:
定义一个动态数组类。
16)思考并回答:
数组,指针,对象数组,动态内存分配,默认构造函数,标准类库,字符串类string,线性拟合。
3.主要仪器设备及软件:
Windows2000+VC6.0
实验四继承与派生
(设计性实验2学时)
1.目的要求:
1)学习定义和使用类的继承关系,定义派生类;熟悉不同继承方式下对基类成员的访问控制;
2)学习利用虚基类解决二义性问题。
2.实验内容:
17)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(intn)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?
编程试试看。
#include
usingnamespacestd;
classanimal
{
public:
intage;
};
classdog:
publicanimal//如果age为私有成员,则不能被继承
{
public:
voidsetage(intn)
{
age=n;
cout<}
};
intmain()
{
dogd;
d.setage(3);
return0;
}
18)定义一个基类BaseClass,有整型成员变量Number,构造其派生类DerivedClass,定义该派生类的对象,观察构造函数和析构函数的执行情况。
#include
usingnamespacestd;
classbaseclass
{
intnumber;
public:
baseclass()
{
cout<<"