实验一  类与对象

一、实验目的

  1. 掌握类的数据成员、成员函数的定义方式;
  2. 理解类成员的访问控制方式;
  3. 理解构造函数和析构函数的定义与执行过程;
  4. 掌握重载构造函数的方法;
  5. 掌握使用拷贝构造函数的方法;
  6. 学习类的组合使用方法;
  7. 掌握对象数组定义和使用方法;
  8. 掌握静态数据成员和静态成员函数的基本使用方法;
  9. 理解友元函数和友元类的作用,掌握其使用方法;
  10. 学习使用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、定义拷贝构造函数并调用。

7、设计一个简单的主函数对CPU类进行调试。

第一步:根据项目内容总结出此项目所考核的主要知识点。

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

xing

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.定义、调用友元函数时不用类名,直接调用

完整代码移步资源下载(免费)~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐