一、实验目的
- 理解面向对象程序设计中的类、对象的概念。
- 理解面向对象程序设计的特性中,「抽象性」和「封装性」的体现和意义。
- 掌握类的定义和实现。
- 掌握对象的定义和使用。
- 理解类的构造函数、析构函数、复制构造函数的用途和编写。
- 了解使用 UML 类图描述类的方法。
二、实验准备
实验前,请围绕以下内容复习/学习指定内容
- 面向对象程序设计的基本概念、特性
复习教材 1.2 节、4.1 节,结合课件相关部分,进一步加深对以下内容的理解:- 面向对象程序中,「对象」、「类」、「消息」的概念
- 抽象性、封装性、多态性
- 内联函数、带默认形参值的函数、函数重载
复习教材 3.2 节~3.4 节,巩固上述内容。 - C++中类的定义和实现的语法形式、对象的定义和使用方法
结合教材 4.2 节和课件相关部分快速浏览、复习。 - C++中类的成员函数中,构造函数、复制构造函数、析构函数的作用和语法形式
结合教材 4.3 节和课件相关部分浏览、学习。
三、实验内容
- 验证性实验
- 依次运行表 1 中的 5 个*.cpp 源文件(已随本文档一起打包放在课程公邮→实验文
件夹),结合源文件内注释、程序运行结果以及 UML 类图,理解和掌握类和对象定义和使
用的方法,以及其中关于构造函数、复制构造函数、析构函数的知识。
其中:- 表 1 中使用的简单 UML 类图符号,请参考 4.5 节对照了解。
- 想要进一步了解 UML 类图的绘制,请参考:
- 教材 P114「例 4-3 游泳池改造预算,Circle 类」
运行示例,结合示例理解和体会面向对象编程与结构化编程中思维方式的不同。
- 依次运行表 1 中的 5 个*.cpp 源文件(已随本文档一起打包放在课程公邮→实验文
示例文件名 | 示例主要说明的内容 | UML 类图 |
---|---|---|
test_point0.cpp | 类的定义和使用 | |
test_point1.cpp | 类的定义和使用 用户自定义默认构造函数和析构函数 |
|
test_point2.cpp | 类的定义和使用 用户自定义默认构造函数、带参数的构造函数、析构函数 |
|
test_point3.cpp | 类的定义和使用 用户自定义默认构造函数、带参数的构造函数、复制构造函数、析构函数 |
|
test_point4.cpp | 类的定义和使用 在 test_point3.cpp 基础上的改进,展示构造函数在书写形式上的另一种写法 |
同上 |
- 编程实验
用 c++编程实现以下内容:- 习题 4-11(教材 P144)
要求:设计矩形类时,成员函数除了包括计算矩形面积的成员函数之外,还包括自定义
构造函数、复制构造函数、析构函数。 - 习题 4-20 (教材 P145)
基于题目要求,给出 Complex 类的 UML 类图参考如下:
图 1 Complex 类图
- 习题 4-11(教材 P144)
四、实验结论
- 验证性实验部分
总结你对类、对象、构造函数、复制构造函数、析构函数的认识、理解和思考。- 类:包含某些数据组成的包,由private、public实现其封装的特性,由protected实现其继承的特性。e.g.
Class student{
private: int id;……
public: ……
protected: ……
}
+ **对象**:是一个类的实例,具有属性和方法。e.g.`ClassName *a=new ClassName `
+ **构造函数**:一个类里用于建立对象的子程序,函数名称一般与所属类名称相同。可以由不同的函数定义进行重载。e.g.`ClassName(type1 c0)`
+ **复制构造函数**:建立一个已知对象副本的程序。e.g.`ClassName(const ClassName &c0)`
+ **析构函数**:释放对象生命时调用的函数。e.g.`~ClassName()`
- 编程实验部分
- 习题 4-11
#include<bits/stdc++.h>
using namespace std;
class Rectangle{
private:
double height,length;
public:
Rectangle(double h=1,double l=1){
cout<<"自定义构造函数被调用"<<endl;
height=h;
length=l;
}
Rectangle(const Rectangle &c0){
cout<<"复制构造函数被调用"<<endl;
height=c0.height;
length=c0.length;
}
void CalArea(){
cout<<showpoint<<"The rectangle's Area is:"<<height*length<<endl;
return ;
}
void Print(){
cout<<"The rectangle's height is:"<<height<<" length is:"<<length<<endl;
return ;
}
~Rectangle(){
cout<<"析构函数被调用"<<endl;
}
};
int main(){
srand((unsigned)time(NULL));
Rectangle b(10,10);
Rectangle a=b;
cout<<"Rectangle b:";
b.Print();
cout<<"Rectangle a:";
a.Print();
Rectangle *c=new Rectangle(rand()%100,rand()%100);
c->Print();
c->CalArea();
cout<<"释放c:";
delete c;
return 0;
}
+ 习题 4-20
#include<bits/stdc++.h>
using namespace std;
class Complex{
private:
double real, imaginary;
public:
Complex(double r0,double i0){
real=r0;
imaginary=i0;
}
Complex(double r0){
real=r0;
imaginary=0;
}
Complex(const Complex &c0){
real=c0.real;
imaginary=c0.imaginary;
}
void add(const Complex &c0){
real+=c0.real;
imaginary+=c0.imaginary;
}
void show(){
if(imaginary>=0)cout<<real<<"+"<<imaginary<<"i"<<endl;
else cout<<real<<imaginary<<"i"<<endl;
}
};
int main(){
Complex c1(3,5);
Complex c2=4.5;
c1.add(c2);
c1.show();
return 0;
}
五、实验总结与体会
- 由于有Java语言学习的基础,对于C++中类的学习便触类旁通,使用方法基本完全相同。
- 最近在帮国外小伙伴写(划掉)修改C++作业,他们的作业是这样的:
,同样的学习基础,私以为他们的作业更难一些,也更容易快速学会类一些。 - 博客园内markdown语法对表格的支持并不好,修改了CSS才得以实现文档中的效果。