1. 验证性实验部分
(1)类:在面向对象程序设计中,类构成程序模块。类是一个模板,它描述一类对象的行为和状态。
(2)对象:对象是类的一个实例。
(3)构造函数:构造函数的作用是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,且构造函数在对象被创建时将被自动调用。
(4)复制构造函数:是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用。其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象。
(5) 析构函数:析构函数用来完成对象被删除前的一些清理工作,提供一个在对象删除前可以释放这个对象所占有的资源的机会。
可以用以下图片说明类与对象之间的关系:
图中男孩女孩为类,而具体的每个人为该类的对象。
析构函数在目前我们的编程练习中,可能没有什么作用。但根据网上资料,在之后的学习,例如指针中,析构函数清理就是帮助回收有依赖关系的内存空间。
2. 编程实验部分
4-11
#include<iostream> using namespace std; class Rectangle { public: Rectangle(double l, double w); //自定义构造函数 Rectangle(Rectangle &r); //复制构造函数 ~Rectangle(); //析构函数 double Area(); //计算矩形面积的函数 private: double length, width; }; Rectangle::Rectangle(double l, double w) //构造函数的实现 { length = l; width = w; } Rectangle::Rectangle(Rectangle &r) //复制构造函数实现 { length = r.length; width = r.width; } Rectangle::~Rectangle() //析构函数实现 { cout << "数据已清除" << endl; } double Rectangle::Area() //计算矩形面积的函数的实现 { return length*width; } int main() { double length,width; cout << "请输入矩形的长、宽: "; cin >> length >> width; Rectangle R1(length, width); Rectangle R2(R1); cout<<"面积为:"<<R2.Area()<<endl; return 0; }
4-20
#include <iostream> using namespace std; class complex { public: complex(double r, double i); //自定义构造函数 complex(double r); //重载 complex(complex &t); //复制构造函数 void add(complex c2); //加法函数 void show(); private: double real, imaginary; }; complex::complex(double r, double i) //构造函数实现 { real = r; imaginary = i; } complex::complex(double r) //重载 { real = r; imaginary = 0; } complex::complex(complex &t) { real = t.real; imaginary = t.imaginary; } void complex::add(complex c2) //加法函数实现 { real += c2.real; imaginary += c2.imaginary; } void complex::show() //输出函数实现 { cout<< real << "+" << imaginary << "i" << endl; } int main() { complex c1(3.0, 5.0); //数据的输入 complex c2(4.5); c1.add(c2); c1.show(); return 0; }
3.实验总结与体会
通过实验,我加深了对类、对象、构造函数、复制构造函数和析构函数的认识和了解。在上课时有些不理解的地方,通过5 个cpp文件及其中的注释,并且通过比较其运行时的区别可以直观的了解构造函数、复制构造函数和析构函数的作用。
在实验二中,在纠结是要写一个类似“用户输入实部虚部”的简单界面,还是直接定义。最后还是选择了如上的方法。虽然答案是正确的,但总感觉有些问题。并且好像写了一个复制构造函数却没有在main函数中用到。