实训2:C++ 面向对象 - 类和对象的创建和使用
参考代码 by 小喾苦
答案仅供参考!
文章目录
第1关:设计一个学生信息类
任务描述
本关任务:声明并定义一个学生信息类。
相关知识
为了完成本关任务,你需要掌握类的声明和定义。
类
在现实世界中,经常有属于同一类的对象。例如,你的自行车只是世界上很多自行车中的一辆。在面向对象软件中,也有很多共享相同特征的不同的对象,可以利用这些对象的相同特征为它们建立一个集合,而这个集合就称为类。
C++ 中类是把各种不同类型的数据(称为数据成员)和对数据的操作(成员函数)组织在一起而形成的用户自定义的数据类型。它提供了可重用性的好处。
类定义包括声明和实现两大部分。声明部分提供了对该类所有数据成员和成员函数的描述,而实现部分提供了所有成员函数的实现代码。
类的声明
类的声明,指的是描述一个类所拥有的结构。类的声明主要包含两个部分:成员变量和成员函数。
声明一个类的格式如下:
class 类名
{
public: // 类的公有成员
int A; // 公有的成员变量
void PublicFunc(); // 公有的成员函数
private: // 类的私有成员
long B; // 私有的成员变量
void PrivateFunc(); // 私有的成员函数
public: // public,private 块可以多次交替出现
double C;
}; // 注意不要忘了最后的分号
class 是 C++ 中新增的关键字,专门用来声明类的,后面紧跟着类名,类名的首字母一般大写,以和其他的标识符区分开。{}
内部是类所包含的成员变量和成员函数,它们统称为类的成员。public 也是 C++ 的新增关键字,它只能用在类的定义中,表示访问权限,下面这里介绍两种访问性:
- public:公开访问性,代表这个成员能在类的定义以外的地方被使用
- private:私有访问性,代表这个成员只能在类的定义内被使用
例如:
class Test
{
public:
int a;
private:
int b;
};
int main()
{
Test t;
t.a = 10; // 访问公有成员变量,正确
t.b = 10; // 访问私有成员变量,错误
}
类的定义
如果说声明是书的目录,那么定义就是目录所指的具体内容。
类的定义,指的是根据声明具体实现类的功能,与一般的函数定义很相似。
比如:
class Test
{
public:
int a;
void PubFun();
private:
int b;
void PriFun();
}; // 声明一个带有两个成员函数的类
void Test::PubFun() // 定义公有的那个成员函数
{
a = 10;
b = 10; // b 是私有成员变量,只能在成员函数的定义中访问
}
void Test::PriFun() //定义私有的那个成员函数
{
a = 20;
b = 20; // b 是私有成员变量,只能在成员函数的定义中访问
}
定义普通函数与类成员函数只有一点不同:在函数名前面加了类名::
的前缀。其中的::
称之为作用域运算符,它指明了成员函数所属的类。
不管是 public 成员函数,还是 private 成员函数,定义它们的方式都是相同的。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,声明并定义一个学生信息类 StInfo,该类有四个成员变量和两个函数,其访问性都为公有,具体要求如下:
- 学号:
int SID
- 姓名:
char *Name
- 班级:
char *Class
- 手机号:
char *Phone
- 给成员变量赋值的函数:
void SetInfo(int sid,char *name,char* cla,char* phone)
- 打印学生信息的函数:
void PrintInfo()
,格式请参考测试说明。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:1 小郭 计科1班 12312340000
预期输出:
学号:1
姓名:小郭
班级:计科1班
手机号:12312340000
测试输入:2 小王 计科2班 12312340001
预期输出:
学号:2
姓名:小王
班级:计科2班
手机号:12312340001
开始你的任务吧,祝你成功!
参考代码
step1/run.cpp
//设置编码格式
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
#include "stinfo.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
int SID;
string str1,str2,str3;
cin >> SID >> str1 >> str2 >> str3;
char * Name=(char*)str1.c_str(),* Class=(char*)str2.c_str(),* Phone=(char*)str3.c_str();
StInfo info;
info.SetInfo(SID,Name,Class,Phone);
info.PrintInfo();
return 0;
}
step1/stinfo.h
#include <iostream>
using namespace std;
class StInfo
{
/********* Begin *********/
//在此处声明StInfo类
public:
int SID; // 学号
char *Name; // 姓名
char *Class; // 班级
char *Phone; // 手机号
void SetInfo(int sid,char *name,char* cla,char* phone); // 给成员变量赋值的函数
void PrintInfo(); // 给成员变量赋值的函数
/********* End *********/
};
/********* Begin *********/
//在此处定义StInfo类
void StInfo::SetInfo(int sid,char *name,char* cla,char* phone) {
SID = sid;
Name = name;
Class = cla;
Phone = phone;
}
void StInfo::PrintInfo() {
cout << "学号:" << SID << endl;
cout << "姓名:" << Name << endl;
cout << "班级:" << Class << endl;
cout << "手机号:" << Phone << endl;
}
/********* End *********/
第2关:设计一个长方形类
任务描述
本关任务:设计一个长方形类,通过访问它的成员变量来计算面积。
相关知识
为了完成本关任务,你需要掌握对象的创建和通过对象访问类的成员。
对象
类只是一种形式化的定义,要使用类提供的功能,必须使用类的实例,即对象,一个类可以定义多个对象,而对象要占据一定的内存空间。类和对象的关系就像整形和变量的关系。
每个对象都包含类中定义的各个数据成员的存储空间,共享类中定义的成员函数。对象的创建方法与声明一个普通变量相同,也采用类型名 变量名
的格式。
例如:
class Test
{
//此处省略 Test 类成员
};
int main()
{
int a; // 声明一个普通变量
Test t1; // 创建一个类的对象
}
对象访问类的成员
通过对象也可以访问一个类的成员,通过.
成员运算符,格式是对象名.成员名
。
如果是数据成员,就可以对它进行赋值,如果是函数成员,就可以调用它。我们可以将其看做为一般变量,只是在变量名前面多了代表它所属对象的前缀。
例如:
#include <iostream>
class Test
{
public: // 两个公有成员
int a;
void Hello();
};
void Test::Hello() // 定义 Test 类的公有函数
{
std::cout << "Hello " << a << std::endl;
}
int main()
{
Test t1;
t1.a = 10; // 给 t1 对象的数据成员 a 赋值
t1.Hello(); // 调用 t1 对象的成员函数 hello
}
输出结果为:Hello 10
注意:访问成员时要注意成员的访问性,详情见上一关。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,设计 Rectangle 类和实现两个普通函数,类中有两个成员变量和两个函数,其中成员变量的访问性为私有,函数的访问性为公有,具体要求如下:
- 高度:
int height
- 宽度:
int width
- 设置长方形的高和宽函数:
void Set(int h, int w)
- 获取长方形的面积函数:
int GetArea()
Rectangle GetRect(int h,int w)
普通函数,h 、w 分别代表长方形的高宽,函数用来创建一个 Rectangle 对象并返回。int GetRectArea(Rectangle rect)
普通函数,函数用来获取 rect 对象的面积。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:10 15
预期输出:长方形的面积为:150
测试输入:100 100
预期输出:长方形的面积为:10000
开始你的任务吧,祝你成功!
参考代码
setp2/run.cpp
#include <iostream>
#include "usr.h"
using namespace std;
int main()
{
int h,w;
cin >> h >> w ;
Rectangle rec = GetRect(h,w);
cout<<"长方形的面积为:"<<GetRectArea(rec)<<endl;
}
step2/usr.h
/********* Begin *********/
class Rectangle {
//在此处实现Rectangle类
private:
int height; // 高度
int width; // 宽度
public:
void Set(int h, int w); // 设置长方形的高和宽函数
int GetArea(); // 获取长方形的面积函数
};
void Rectangle::Set(int h, int w) {
height = h;
width = w;
}
int Rectangle::GetArea() {
return height * width;
}
/********* End *********/
Rectangle GetRect(int h, int w) {
/********* Begin *********/
//返回一个 h*w 的 Rectangle 对象
Rectangle rectangle;
rectangle.Set(h, w);
return rectangle;
/********* End *********/
}
int GetRectArea(Rectangle rect) {
/********* Begin *********/
//返回 rect 对象的面积
return rect.GetArea();
/********* End *********/
}
第3关:设计汽车类
任务描述
本关任务:设计一个汽车类,并实现它的基本功能。
相关知识
完成本关需要具备的知识介绍请参见第一、二关卡。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,设计汽车类实现汽车的基本功能,根据输入的命令来输出汽车的整体状态。具体要求如下:
- 成员变量:车门,车灯,速度(类型以及变量名均自拟)。
- 成员函数:打开车门、关闭车门、打开车灯、关闭车灯、加速、减速。(学员可以根据自己情况增加或者减少函数)
其中打开车门、关闭车门、打开车灯、关闭车灯四个函数,用于改变对象内部对应的成员变量的值。加速,减速两个函数,每次调用就将内部的速度变量分别对应增加10或者减少10。车门,车灯两个函数的初始状态都为 OFF,速度的初始值为0。
根据输入的命令(命令由1-6表示,分别对应调用打开车门、关闭车门、打开车灯、关闭车灯、加速、减速函数)输出汽车的最终状态,若输入命令135
则输出状态如下:
车门 ON
车灯 ON
速度 10
上述命令为135
,则分表调用了打开车门、打开车灯、加速这三个函数,因此最后输出的汽车状态为车门打开,车灯打开和速度为10。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
注意:命令长度不超过 20,最短长度 1。
测试输入:135
预期输出:
车门 ON
车灯 ON
速度 10
测试输入:135562
预期输出:
车门 OFF
车灯 ON
速度 10
开始你的任务吧,祝你成功!
参考代码
step3/usr.cpp
#include <iostream>
#include <cstring>
using namespace std;
/********* Begin *********/
//在此处实现一个汽车类
class Car
{
public:
bool Door; // 车门
bool Light; // 车灯
int V; // 速度
Car(); // 构造函数
void openDoor(); // 打开车门
void closeDoor(); // 关闭车门
void openLight(); // 打开车灯
void closeLight(); // 关闭车灯
void accelerate(); // 加速
void decelerate(); // 减速
};
Car::Car(): Door(false), Light(false), V(0) {
}
void Car::openDoor() {
Door = true;
}
void Car::closeDoor() {
Door = false;
}
void Car::openLight() {
Light = true;
}
void Car::closeLight() {
Light = false;
}
void Car::accelerate() {
V += 10;
}
void Car::decelerate() {
V -= 10;
}
/********* End *********/
int main()
{
/********* Begin *********/
//在此处解析执行输出汽车的整体状态
char cmds[25];
cin>>cmds;
// 执行命令
Car car;
for (size_t i = 0; i < strlen(cmds); i = i + 1) {
if (cmds[i] == '1') {
car.openDoor();
} else if (cmds[i] == '2') {
car.closeDoor();
} else if (cmds[i] == '3') {
car.openLight();
} else if (cmds[i] == '4') {
car.closeLight();
} else if (cmds[i] == '5') {
car.accelerate();
} else if (cmds[i] == '6') {
car.decelerate();
} else {
// undefind command
}
}
// 输出状态
cout << "车门 " << (car.Door ? "ON" : "OFF") << endl;
cout << "车灯 " << (car.Light ? "ON" : "OFF") << endl;
cout << "速度 " << car.V << endl;
/********* End *********/
}