实验 3:类和对象

一、实验目的


  • 理解面向对象程序设计中的类、对象的概念。
  • 理解面向对象程序设计的特性中,「抽象性」和「封装性」的体现和意义。
  • 掌握类的定义和实现。
  • 掌握对象的定义和使用。
  • 理解类的构造函数、析构函数、复制构造函数的用途和编写。
  • 了解使用 UML 类图描述类的方法。

二、实验准备


实验前,请围绕以下内容复习/学习指定内容

  • 面向对象程序设计的基本概念、特性
    复习教材 1.2 节、4.1 节,结合课件相关部分,进一步加深对以下内容的理解:
    • 面向对象程序中,「对象」、「类」、「消息」的概念
    • 抽象性、封装性、多态性
  • 内联函数、带默认形参值的函数、函数重载
    复习教材 3.2 节~3.4 节,巩固上述内容。
  • C++中类的定义和实现的语法形式、对象的定义和使用方法
    结合教材 4.2 节和课件相关部分快速浏览、复习。
  • C++中类的成员函数中,构造函数、复制构造函数、析构函数的作用和语法形式
    结合教材 4.3 节和课件相关部分浏览、学习。

三、实验内容


  • 验证性实验
    • 依次运行表 1 中的 5 个*.cpp 源文件(已随本文档一起打包放在课程公邮→实验文
      件夹),结合源文件内注释、程序运行结果以及 UML 类图,理解和掌握类和对象定义和使
      用的方法,以及其中关于构造函数、复制构造函数、析构函数的知识。
      其中:
    • 教材 P114「例 4-3 游泳池改造预算,Circle 类」
      运行示例,结合示例理解和体会面向对象编程与结构化编程中思维方式的不同。
示例文件名 示例主要说明的内容 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 类图

四、实验结论


  • 验证性实验部分
    总结你对类、对象、构造函数、复制构造函数、析构函数的认识、理解和思考。
    • :包含某些数据组成的包,由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才得以实现文档中的效果。
原文地址:https://www.cnblogs.com/shy-/p/8692464.html