一、实验目的
1.理解面向对象程序设计中的类、对象的概念。
2.理解面向对象程序设计的特性中,「抽象性」和「封装性」的体现和意义。
3.掌握类的定义和实现。
4.掌握对象的定义和使用。
5.理解类的构造函数、析构函数、复制构造函数的用途和编写。
6.了解使用UML类图描述类的方法。
二、实验准备
实验前,请围绕以下内容复习/学习指定内容
1.面向对象程序设计的基本概念、特性
复习教材1.2节、4.1节,结合课件相关部分,进一步加深对以下内容的理解:
①面向对象程序中,「对象」、「类」、「消息」的概念
②抽象性、封装性、多态性
2.内联函数、带默认形参值的函数、函数重载
复习教材3.2节~3.4节,巩固上述内容。
3. C++中类的定义和实现的语法形式、对象的定义和使用方法
结合教材4.2节和课件相关部分快速浏览、复习。
4. C++中类的成员函数中,构造函数、复制构造函数、析构函数的作用和语法形式结合教材4.3节和课件相关部分浏览、学习。
三、实验内容
1.验证性实验
(1)依次运行表1中的5个*.cpp源文件(已随本文档一起打包放在课程公邮→实验文
件夹),结合源文件内注释、程序运行结果以及UML类图,理解和掌握类和对象定义和使用的方法,以及其中关于构造函数、复制构造函数、析构函数的知识。
其中:
①表1中使用的简单UML类图符号,请参考4.5节对照了解。
②想要进一步了解UML类图的绘制,请参考:
a)StarUML使用说明-指导手册
https://blog.csdn.net/monkey_d_meng/article/details/5995610
b)类图及绘制工具:StarUML
https://www.jianshu.com/p/617f6f413452
c) SatrUML下载链接
https://sourceforge.net/projects/staruml/
(2)教材P114「例4-3游泳池改造预算,Circle类」
运行示例,结合示例理解和体会面向对象编程与结构化编程中思维方式的不同。

2.编程实验
用c++编程实现以下内容:
(1)习题4-11(教材P144)
要求:设计矩形类时,成员函数除了包括计算矩形面积的成员函数之外,还包括自定义
构造函数、复制构造函数、析构函数。
(2)习题4-20(教材P145)
基于题目要求,给出Complex类的UML类图参考

四、实验结论
1.验证性实验部分
总结你对类、对象、构造函数、复制构造函数、析构函数的认识、理解和思考。

(1)类把属性和方法进行封装,对类的属性和方法进行访问控制。类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。

(2)在C中,“数据”和“函数”是分开来声明的,但是在C++中却提供了“类”来将“数据”和“函数”绑定在了一起。C++中的类由成员变量,静态成员变量,构造函数,成员函数,静态函数和虚函数组成。

(3)C++的类是用结构体实现的,类中的成员变量和结构体里的变量内存布局方式一致。C++类中的成员函数隐式包含一个指向当前对象的指针,哪个对象调用该函数,C++编译器就默认将该对象包含在函数中。静态成员变量和静态成员函数属于类,静态成员函数不包含指向具体对象的指针。

(4)构造函数的定义及调用方式

定义:C++类中可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数。构造函数可以有参数列表,但是不能有函数返回值。

调用:一般情况下C++编译器会自动调用构造函数,但在一些情况下则需要手工调用构造方法。

分类:无参构造函数  有参构造函数  复制构造函数

(5)当类中没有定义任何构造函数的时候,C++编译器默认为我们定义一个无参构造函数,函数体为空。

当在类中定义任意构造函数后(包括复制构造函数),C++编译器就不会为我们定义默认构造函数,也就是说我们定义了构造函数就必须要使用。

C++默认提供复制构造函数只是进行了简单的成员变量的值的复制。复制构造函数只有当我们写了以后C++编译器才不会给我提供,如若不写则C++编译器会一直提供默认的复制构造函数。

(6)析构函数

定义:C++类中可以定义一个特殊的成员函数来清理对象和释放我们在对象中分配的内存,这个特殊的方法叫做析构函数。

调用:当对象生命周期临近结束时,析构函数由C++编译器自动调用。

使用:析构通常是在对象生命周期结束之前调用,我们会在此时去释放我们在对象中创建的堆内存,保证程序的合理性。

(7)当类中有成员是其他类的对象时,首先调用成员变量的构造函数,调用顺序和成员变量的定义顺序一致。成员变量的构造函数统统执行完毕后,再调用该类的构造函数。

2.编程实验部分
(1)习题4-11
源代码及运行测试截图

 1 #include <iostream>
 2 using namespace std;
 3 class Juxing    //声明类Juxing及其数据和方法
 4 {
 5 public:    //外部接口
 6     Juxing(float x,float y)
 7     {
 8         length=x;
 9         width=y;
10     }
11     //构造函数
12     ~Juxing(){};
13     float Area()
14     {
15     return length*width;
16     }    //计算矩形面积
17 private:    //私有数据成员
18     float length;
19     float width;
20 };
21 
22 //主函数实现
23 int main ()
24 {
25     float length,width,S;
26     cout << "Enter the lENGTH and WIDTH: ";     // 提示用户输入长和宽 
27     cin >>length>>width;
28     Juxing s(length,width);
29     S=s.Area() ;
30     cout << "Area is " << S << endl;
31 return 0;
32 }

 

 

(2)习题4-20
源代码及运行测试截图

 

 1 #include<iostream>
 2 using namespace std;
 3 class Complex
 4 {
 5  public:
 6  Complex(float r1,float i1)//定义复数函数 
 7      {
 8          real=r1;
 9          imag=i1;
10     };
11  Complex(float r1)
12      {
13           real=r1;
14           imag=0;
15      };
16  void add(Complex &c)//运算函数 
17      {
18          real+=c.real;
19          imag+=c.imag;
20     };
21  void show()//展示结果 
22      {
23          cout<<real<<(imag>0 ? '+':'-')<<imag<<'i'<<endl;
24     };
25  private:
26 float real;
27 float imag;
28 };
29 //主函数实现 
30 int main()
31 {
32     
33  Complex c1(3,5);
34  Complex c2=4.5;
35  c1.add(c2);
36  c1.show();
37  return 0;
38 }

 

五、实验总结与体会

结合你在本次实验中的收获、感受等,也可以是自己延伸自学及编程实践中的新收获、发现、思考,等等。

1.类与对象部分是C与C++中不同的部分,它丰富了编程语言,但与结构体也有类似。

2.类是一组类似对象的共同抽象定义,对象是类的实例化结果,对象是实实在在的存在,代表现实世界的某一事物。

3.类是静态定义,对象是动态实例,程序代码操作的是对象而非类,建模得到的是类而非对象。

4.类是对象的定义,对象的产生离不开类这个模板,类存在的目的是实例化得到对象。

5.将对象和对象的共同点抽象出来,可以构成一个类。

6.定义一个类的步骤

<1>定义类名

<2>编写类的数据成员代表属性

<3>编写类的方法代表行为

7.类的建模是一个抽象和封装的过程。

8.在C++中类和结构体的区别主要体现在安全性上:

 class中默认的成员访问权限是private的,而结构体中则是public的。

 从class继承默认是private继承,而从结构体继承默认是public继承。

9.结构体能做到,类都能做。

 

版权声明:本文为su22原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/su22/p/sy03.html