C++实验一 类与对象
C++实验一 类与对象
实验一 类与对象
一、实验目的
- 掌握类的数据成员、成员函数的定义方式;
- 理解类成员的访问控制方式;
- 理解构造函数和析构函数的定义与执行过程;
- 掌握重载构造函数的方法;
- 掌握使用拷贝构造函数的方法;
- 学习类的组合使用方法;
- 掌握对象数组定义和使用方法;
- 掌握静态数据成员和静态成员函数的基本使用方法;
- 理解友元函数和友元类的作用,掌握其使用方法;
- 学习使用debug调试功能观察程序执行过程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。掌握对象的作用域、生存期和可见性;
二、实验内容
项目一:
1、声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有三个公有成员函数run、stop和setCPU。其中,rank为枚举类型CPU_Rank,声明为enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};frequency为单位是MHz的整数,voltage为浮点型的电压值。run和stop函数分别显示“CPU开始运行!”和“CPU停止运行!”。setCPU用于CPU属性的设置。
2、创建一个CPU对象,并用setCPU函数进行属性设置。
3、使用构造函数代替上面的setCPU成员函数,并创建一个CPU对象。
4、重载CPU类的构造函数(不带参数),使rank、frequency、voltage分别为P6、3000、220。
5、定义析构函数,在其中输出信息“Good bye!”。观察构造函数和析构函数的调用顺序。
6、定义拷贝构造函数并调用。
第一步:根据项目内容总结出此项目所考核的主要知识点。
1.类的数据成员、成员函数的定义方式
2.类成员的访问控制方式
3.构造函数和析构函数的定义与执行过程
4.重载构造函数的方法
5.使用拷贝构造函数的方法
第二步:设计类
1.数据成员
CPU
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
等级 |
rank |
CPU_Rank |
private |
无 |
|
频率 |
frequency |
int |
private |
无 |
|
电压 |
voltage |
float |
private |
无 |
2.成员函数声明
CPU
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
无参构造函数 |
CPU() |
无 |
无 |
public |
|
有参构造函数 |
CPU(int a,int b,float c) |
等级、频率、电压 |
无 |
public |
|
拷贝函数 |
CPU(const CPU &cpu) |
CPU |
无 |
public |
|
析构函数 |
~CPU() |
无 |
无 |
public |
|
输出"CPU开始运行!" |
run() |
无 |
无 |
public |
|
输出"CPU停止运行!" |
stop() |
无 |
无 |
public |
|
设置CPU的三个属性 |
setCPU(int a,int b,float c) |
等级、频率、电压 |
无 |
public |
|
输出等级、频率、电压 |
out() |
无 |
无 |
public |
3.主函数流程图

4.测试

第三步:设计主函数(主要用来测试项目中的类)
int main()
{
CPU a1;
int a,b;
float c;
cout<<"setCPU函数:请按顺序输入等级(1-7)、频率(MHz)、电压"<<endl;
cin>>a>>b>>c;
a1.setCPU(a,b,c);
a1.run();
a1.out();
a1.stop();
cout<<"有参构造函数:请按顺序输入等级(1-7)、频率(MHz)、电压"<<endl;
cin>>a>>b>>c;
CPU a2(a,b,c);
a2.run();
a2.out();
a2.stop();
cout<<"无参构造函数:"<<endl;
CPU a3;
a3.run();
a3.out();
a3.stop();
cout<<"拷贝(上一个CPU对象)构造函数:"<<endl;
CPU a4(a3);
a4.run();
a4.out();
a4.stop();
}
第四步:完整程序代码
第五步:总结
1.拷贝函数可以更改拷贝对象数值而使生成的对象改变
2.在主函数结束时,对象被撤销,系统会自动调用析构函数。
建立对象用构造函数,撤销对象,释放分配给对象的存储空间用析构函数。
项目二:
1、定义一个Stock类,记录一支股票交易的基本信息,信息包括交易日序号(表示本月的第几个交易日,用整数表示)、当日最高价、当日最低价、当日开盘价和当日收盘价。尽量发挥想象力,为该类设计成员函数。
2、在主函数中建立一个月的股票对象,分别存储该股票每天的信息,以当日收盘价计算该股票今天的涨幅。
3、找出当月涨幅最大的股票。(需要用到静态数据成员)
第一步:根据项目内容总结出此项目所考核的主要知识点。
1.对象数组
2.比较大小
3.静态数据成员
第二步:设计类
1.数据成员
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
股票名称 |
name |
string |
private |
无 |
|
交易日序号 |
day |
int |
private |
无 |
|
当日最高价 |
max |
double |
private |
无 |
|
当日最低价 |
min |
double |
private |
无 |
|
当日开盘价 |
start |
double |
private |
无 |
|
当日收盘价 |
stop |
double |
private |
无 |
|
当日涨幅 |
daygrow |
double |
public |
无 |
|
月涨幅 |
monthgrow |
double |
public |
无 |
2.成员函数声明
Stock
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
有参构造函数 |
Stock(string name,int day,double max,double min,double start,double stop) |
名字、交易日序号、当日最高价、当日最低价、当日开盘价、当日收盘价 |
无 |
public |
|
显示股票信息(名字、交易日序号、当日涨幅) |
get() |
无 |
无 |
public |
|
返回当日开盘价 |
getstart() |
无 |
double |
public |
|
返回当日收盘价 |
getstop() |
无 |
double |
public |
3.主函数流程图

4.测试

第三步:设计主函数(主要用来测试项目中的类)
int main()
{
Stock stock1[5]={Stock("上海",1,100,10,20,50),Stock("上海",2,200,30,50,150),Stock("上海",3,250,10,150,100),Stock("上海",4,710,90,100,700),Stock("上海",5,700,125,700,400)};
Stock stock2[5]={Stock("深圳",1,300,100,110,300),Stock("深圳",2,350,10,300,50),Stock("深圳",3,200,40,50,150),Stock("深圳",4,210,110,150,120),Stock("深圳",5,130,56,120,60)};
cout<<"上海股票情况:"<<endl;
for(int i=0;i<5;i++){
stock1[i].get();
}
cout<<endl<<"深圳股票情况:"<<endl;
for(int i=0;i<5;i++){
stock2[i].get();
}
static double monthgrow;
monthgrow=stock1[4].getstop()-stock1[0].getstart();
if((stock2[4].getstop()-stock2[0].getstart())>monthgrow)
{
monthgrow=stock2[4].getstop()-stock2[0].getstart();
cout<<endl<<"当月涨幅最大的股票:深圳"<<endl;
cout<<"当月涨幅:"<<monthgrow<<endl;
}
else cout<<endl<<"当月涨幅最大的股票:上海"<<endl;
cout<<"当月涨幅:"<<monthgrow<<endl;
return 0;
}
第四步:完整程序代码
第五步:总结
1.对象数组在数组体内进行有参构造函数调用初始化即可
2.比较大小
3.静态数据成员
项目三:
1、声明一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等,有两个公有成员函数run和stop。cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。(提示:CPU类为项目一中所定义的。RAM类与CDROM类仿照CPU类进行设计。)
2、要求采用多文件组织,资料参见教材4.8小节。类的接口定义存在头文件中、类的实现存储在cpp文件中。主函数所在文件要求包含头文件。
3、构造函数多样化。(至少想出两种需要初始化的方法)
例如:可以是一台组装机,已有内存、芯片、光驱,组装一台新机器。
可以是一台品牌机,参数有:内存大小、cpu的主频、光驱品牌
第一步:根据项目内容总结出此项目所考核的主要知识点。
1.多文件组织,类的接口定义存在头文件中、类的实现存储在cpp文件中。且如本代码中将#include "ALL.h"放至main.cpp和ALL.cpp文件中。
2.通过自定义public方法(set(),get())进行private成员变量的修改,输出
3.带参构造函数的重载(本代码是参数类型不同),实现构造函数的多样化
第二步:设计类
1.数据成员
Computer
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
芯片 |
cpu |
CPU |
private |
无 |
|
内存 |
ram |
RAM |
private |
无 |
|
光驱 |
cdrom |
CDROM |
private |
无 |
CPU
|
名称 |
类型 |
访问权限 |
Static |
|
|
等级 |
rank |
CPU_Rank |
private |
无 |
|
频率 |
frequency |
int |
private |
无 |
|
电压 |
voltage |
float |
private |
无 |
RAM
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
品牌 |
brank |
string |
private |
无 |
|
主频 |
f |
double |
private |
无 |
|
容量 |
capacity |
double |
private |
无 |
CDEOM
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
品牌 |
brank |
string |
private |
无 |
|
传输速率 |
v |
int |
private |
无 |
2.成员函数声明
Computer
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
有参构造函数(组装机) |
Computer(CPU cpu,RAM ram,CDROM cdrom) |
芯片、内存、光驱 |
无 |
public |
|
有参构造函数 (品牌机) |
Computer(double capacity,int frequency,string brank) |
内存大小、cpu的主频、光驱品牌 |
无 |
public |
|
输出"Computer开始运行!" |
run() |
无 |
无 |
public |
|
输出"Computer停止运行!" |
stop() |
无 |
无 |
public |
|
输出芯片、内存、光驱参数 |
out1() |
无 |
无 |
public |
|
输出内存大小、cpu的主频、光驱品牌 |
out2() |
无 |
无 |
public |
CPU
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
无参构造函数 |
CPU() |
无 |
无 |
public |
|
有参构造函数 |
CPU(int a,int b,float c) |
等级、频率、电压 |
无 |
public |
|
输出"CPU开始运行!" |
run() |
无 |
无 |
public |
|
输出"CPU停止运行!" |
stop() |
无 |
无 |
public |
|
改变频率 |
set(int frequency) |
频率 |
无 |
public |
|
输出频率 |
get() |
无 |
无 |
public |
|
输出等级、频率、电压 |
out() |
无 |
无 |
public |
RAM
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
无参构造函数 |
RAM () |
无 |
无 |
public |
|
有参构造函数 |
RAM (string a,double b,double c) |
品牌、主频、容量 |
无 |
public |
|
输出" RAM开始运行!" |
run() |
无 |
无 |
public |
|
输出" RAM停止运行!" |
stop() |
无 |
无 |
public |
|
改变内存容量 |
set(double capacity) |
内存容量 |
无 |
public |
|
输出内存容量 |
get() |
无 |
无 |
public |
|
输出品牌、主频、容量 |
out() |
无 |
无 |
public |
CDROM
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
无参构造函数 |
CDROM() |
无 |
无 |
public |
|
有参构造函数 |
CDROM(string a,int b) |
品牌、传输效率 |
无 |
public |
|
输出"CDROM开始运行!" |
run() |
无 |
无 |
public |
|
输出"CDROM停止运行!" |
stop() |
无 |
无 |
public |
|
改变光驱品牌 |
set(string brank) |
光驱品牌 |
无 |
public |
|
输出光驱品牌 |
get() |
无 |
无 |
public |
|
输出品牌、传输速率 |
out() |
无 |
无 |
public |
3.主函数流程图

4.测试

第三步:设计主函数(主要用来测试项目中的类)
int main()
{
cout << "请按顺序输入一台组装机芯片(等级、频率、电压)、内存(品牌、主频、容量)、光驱参数(品牌、传输速率):" << endl;
int rank,frequency;
float voltage;
cin>>rank>>frequency>>voltage;
CPU cpu(rank,frequency,voltage);
string brank1;
double f,capacity;
cin>>brank1>>f>>capacity;
RAM ram(brank1,f,capacity);
string brank2;
int v;
cin>>brank2>>v;
CDROM cdrom(brank2,v);
Computer A(cpu,ram,cdrom);
A.run();
A.out1();
A.stop();
cout << "请按顺序输入一台品牌机内存大小、cpu的主频、光驱品牌:" << endl;
cin>>capacity>>frequency>>brank2;
Computer B(capacity,frequency,brank2);
B.run();
//B.out1();
B.out2();
B.stop();
return 0;
}第四步:完整程序代码
第五步:总结
1.多文件组织,类的接口定义存在头文件中、类的实现存储在cpp文件中。且如本代码中将#include "ALL.h"放至main.cpp和ALL.cpp文件中。
2.通过自定义public方法(set(),get())进行private成员变量的修改,输出
3.带参构造函数的重载(本代码是参数类型不同),实现构造函数的多样化
项目四:
1、定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,change_name改变对象的姓名属性。定义包含5个元素的对象数组,每个元素都是Employee类型的对象。
2、将姓名构造成类Name。其名和姓在该类中为保护数据成员,其构造函数为接受一个指向完整姓名字符串的指针,其Display()函数输出姓名。然后将Employee类中的姓名成员(字符数组)换成Name类对象。
3、构成完整的类定义,要求类定义与类的成员函数定义分开。
4、设计一个简单的主函数对Employee类、Name类进行调试。
第一步:根据项目内容总结出此项目所考核的主要知识点。
1.指针
2.字符数组
第二步:设计类
1.数据成员
Name
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
姓 |
|
char[10] |
private |
无 |
|
名 |
ming |
char[10] |
private |
无 |
Employee
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
姓名 |
name |
Name |
private |
无 |
|
街道地址 |
adr[20] |
char[20] |
private |
无 |
|
城市 |
city |
char[20] |
private |
无 |
|
邮编 |
post |
char[20] |
private |
无 |
2.成员函数声明
Name
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
无参构造函数 |
Name() |
无 |
无 |
public |
|
有参构造函数 |
Changename(const char*,const char*) |
姓、名指针(首地址) |
无 |
public |
|
将姓、名合为姓名 |
char* |
姓、名指针(首地址) |
返回姓名指针 |
public |
|
显示姓名 |
display() |
无 |
无 |
public |
|
更改姓 |
setXing(const char*) |
姓指针 |
无 |
public |
|
更改名 |
setMing(const char*) |
名指针 |
无 |
public |
Employee
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
有参构造函数 |
Employee(const char*, const char*,const char*, const char*, const char*) |
姓、名、街道地址、城市、邮编指针(首地址) |
无 |
public |
|
改变姓、名 |
ChangeName(const char*,const char*) |
姓、名指针(首地址) |
无 |
public |
|
显示所有信息 |
Display() |
无 |
无 |
3.主函数流程图

4.测试

第三步:设计主函数(主要用来测试项目中的类)
int main() {
Employee em[5]={
Employee("ni","hao", "danqinglu", "zhengzhou", "450000"),
Employee("ta","hai", "xisanhuan","shanghai","100000"),
Employee("xiao","ming","jingguanglu","qingdao","200000"),
Employee("fan","ren","henangongyedaxue","luoyang","300000"),
Employee("lan","tian","henangongyedaxue","pingdingshan","400000")
};
em[0].Display();
em[0].ChangeName("n","h");
int i;
for (i = 0; i < 5; i++)
em[i].Display();
}
第四步:完整程序代码
第五步:总结
1.可以直接引用指针参数,也可以直接返回指针类型函数
2.活学活用字符数组方法
项目五:
1、设计一个用于人员管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、类的组合。
第一步:根据项目内容总结出此项目所考核的主要知识点。
构造函数和析构函数、拷贝构造函数、内联成员函数、类的组合
第二步:设计类
1.数据成员
Date
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
日期 |
date |
int |
private |
无 |
People
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
编号 |
number |
int |
private |
无 |
|
性别 |
sex |
string |
private |
无 |
|
出生日期 |
birthday |
Date |
private |
无 |
|
身份证号 |
id |
string |
private |
无 |
2.成员函数声明
Date
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
无参构造函数 |
Date() |
无 |
无 |
public |
|
有参构造函数 |
Date(int a) |
日期 |
无 |
public |
|
拷贝构造函数 |
Date(const Date &p) |
Date |
无 |
public |
|
析构函数 |
~Date() |
无 |
无 |
public |
|
返回date值 |
int getdate() |
无 |
无 |
public |
People
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
人员信息的录入 |
set(int a,string b,Date c,string d) |
编号、性别、出生日期、身份证号 |
无 |
public |
|
人员信息的显示 |
void get() |
无 |
无 |
public |
3.主函数流程图

4.测试

第三步:设计主函数(主要用来测试项目中的类)
int main()
{
nei();
Date a1;
Date a2(20020603);
Date a3(a2);
People b1,b2,b3;
b1.set(1,"女",a1,"a8888");
b2.set(2,"女",a2,"b6666");
b3.set(3,"女",a3,"c5201");
b1.get();
b2.get();
b3.get();
nei();
return 0;
}
第四步:完整程序代码
第五步:总结
1.输出private权限成员变量用public方法即可
2.inline内联函数可以在任意地方使用,不是成员函数,也可以在函数体里输出
项目六:
1、使用C++的类建立一个简单的玩具销售程序。类内必须具有玩具编号、单价、销售量、种类(每类玩具使用一个编号)等属性,并为该类建立一些必要的成员函数。在主程序中建立若干个玩具类对象,用户可以选择购买玩具,不仅显示每种玩具的销售金额,如果销售金额大于某一值(自己设定),显示“XX玩具畅销”字样。并且计算出最畅销的玩具并输出此玩具基本信息。
2、编写一个有关股票的程序,其中有两个类:一个是深圳类Shen_Stock,另一个是上海类Shang_Stock。类中有3项私有数据成员:普通股票个数general、ST股票个数st、PT股票个数pt,每一个类分别有自己的友元函数来计算并显示深圳或上海的股票总数(3项的和)。两个类还共用一个count(),用来计算深圳和上海总共有多少股票并输出。
第一步:根据项目内容总结出此项目所考核的主要知识点。
6.1
1.对象数组
2.比较大小并输出
3.switch语句
6.2
1.友元函数
第二步:设计类
6.1
1.数据成员
toy
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
玩具编号 |
number |
int |
private |
无 |
|
单价 |
price |
double |
private |
无 |
|
销售量 |
volume |
int |
private |
无 |
|
种类 |
kind |
string |
private |
无 |
|
总金额 |
sum |
double |
private |
无 |
2.成员函数声明
toy
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
有参构造函数 |
toy(int a,double b,int c,string kind) |
玩具编号、单价、销售量、种类 |
无 |
public |
|
累加销售量a个 |
buy(int a) |
购买个数 |
无 |
public |
|
返回销售量 |
getvolume() |
无 |
int |
public |
|
返回种类 |
getkind |
无 |
string |
public |
|
是否畅销 |
get_() |
无 |
无 |
public |
|
输出玩具类信息 |
get() |
无 |
无 |
public |
6.2
1.数据成员
Shen_Stock与Shang_Stock
|
属性 |
名称 |
类型 |
访问权限 |
Static |
|
普通股票个数 |
general |
int |
private |
无 |
|
ST股票个数 |
st |
int |
private |
无 |
|
PT股票个数 |
pt |
int |
private |
无 |
2.成员函数声明
Shen_Stock
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
有参构造函数 |
Shen_Stock(int a,int b,int c) |
深圳普通股票个数,ST股票个数,PT股票个数 |
无 |
public |
|
输出深圳股票总数(友元函数) |
gete(Shen_Stock &) |
Shen_Stock |
无 |
public |
|
输出深圳和上海股票和(公用友元函数) |
count(Shen_Stock &,Shang_Stock &) |
Shen_Stock,Shang_Stock |
无 |
public |
Shang_Stock
|
功能 |
名称 |
输入参数 |
返回值 |
权限 |
|
有参构造函数 |
Shang_Stock(int a,int b,int c) |
上海普通股票个数,ST股票个数,PT股票个数 |
无 |
public |
|
输出深圳股票总数(友元函数) |
geta(Shang_Stock &) |
Shen_Stock |
无 |
public |
|
输出深圳和上海股票和(公用友元函数) |
count(Shen_Stock &,Shang_Stock &) |
Shen_Stock,Shang_Stock |
无 |
public |
3.主函数流程图
6.1

6.2

4.测试
6.1

6.2

第三步:设计主函数(主要用来测试项目中的类)
6.1
int main()
{
toy t[3]={
toy(1,100,1000,"芭比"),
toy(2,200,10,"金刚"),
toy(3,1000,15,"乐高")
};
t[0].get_();
t[1].get_();
t[2].get_();
cout<<"是否选择购买玩具?"<<endl;
string i;
cin>>i;
while(i=="是"){
cout<<"请选择购买玩具(编号)"<<endl;
int a,b,c,d;
cin>>a;
switch(a){
case 1:cout<<"芭比"<<endl;
cout<<"您选择购买数量为?"<<endl;
cin>>b;
t[0].buy(b);
cout<<"购买成功!"<<endl;
cout<<"是否选择继续购买玩具?"<<endl;
cin>>i;
break;
case 2:cout<<"金刚"<<endl;
cout<<"您选择购买数量为?"<<endl;
cin>>c;
t[1].buy(c);
cout<<"购买成功!"<<endl;
cout<<"是否选择继续购买玩具?"<<endl;
cin>>i;
break;
case 3:cout<<"芭比"<<endl;
cout<<"您选择购买数量为?"<<endl;
cin>>d;
t[2].buy(d);
cout<<"购买成功!"<<endl;
cout<<"是否选择继续购买玩具?"<<endl;
cin>>i;
break;
default:cout<<"输入错误!"<<endl;
}
}
int temp;
int j=0;
for(;j<2;j++){
if(t[j].getvolume()<t[j+1].getvolume()){
temp=j+1;
}
}
cout<<"最畅销的玩具:"<<t[temp].getkind()<<endl;
t[temp].get();
return 0;
}
6.2
int main()
{
Shen_Stock e(100,20,30);
Shang_Stock a(1,2,3);
gete(e);
geta(a);
count(e,a);
return 0;
}
第四步:完整程序代码
第五步:总结
1.可以直接在构造函数的函数体里由参数中的成员变量计算得到未传参的成员变量
2.声明共用友元函数时需要在前面将在类都作声明
3.定义、调用友元函数时不用类名,直接调用
更多推荐


所有评论(0)