C++实验总结报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c实验报告总结”。
C++ 实验总结报告
研究课题:图形编辑器
一、实验目的1.熟悉C++的一些重要性质,利用封装、继承、虚函数和多态性等特性,通过实验学习如何对各类图元的属性和方法进行合理的封装 2.学习Microsoft的Visual C++编程工具 3.掌握MFC的相关知识
4.掌握基本的文件保存、读取以及操作封装技术
二、实验目的设计一个简单的图形编辑器
三、实验所用仪器、设备
计算机:PentiumIII 800 以上
256M内存 操作系统:Windows 2000/XP 开发集成环境:Visual C++ 6.0
四、软件功能简介
(注:此软件是从网上下载得来)
该软件具有汉化的菜单界面(仿Windows自带画图软件),具有文件打开、编辑、保存等功能。编辑部分包括可以在编辑区域画直线、圆、矩形、曲线等矢量图形,可插入文字,可以修改线条的线型、颜色等基本属性。
五、部分代码分析
1.类的初始分析:
cla CDrawApp : public CWinApp { public: CDrawApp();
// Overrides virtual BOOL InitInstance();
// Implementation protected: //{{AFX_MSG(CDrawApp)afx_msg void OnAppAbout();// NOTE-the ClaWizard will add and remove member functions here.//
DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG DECLARE_MESSAGE_MAP()};学习C++我们最需要理解的就是它面向对象的设计思想。这种思想可以在类和对象上得到充分的体现。
类是面向对象程序设计的核心,它实际上是由用户定义的一种新的复杂数据类型。它是通过抽象数据类型ADT方法来实现的一种数据类型,将不同类型的数据和与这些数据相关的操作封装在一起形成一个集合体。因此,它具有更高的抽象性,实现了信息的隐藏和封装。
对象是某种类的一个实例,是类的具体体现。一个类可以有多个对象。
分析这一段代码,编程者将CDrawApp();设置为公有函数,这样做就是在整个函数的外面开了一个口,使用户可以利用这一函数处理具体问题而不必详解函数内部,是面向对象中封装特性的一个具体体现;另外,此函数中还包含了构造函数与析构函数,构造函数完成对新对象的初始化工作,析构函数是构造函数的配对物,它实现与构造函数相反的功能。另外,这段代码中还包括布尔型虚函数InitInstance(),这是函数重载,也是多态性的具体体现。
由这段代码我们可以了解关于类和对象的一些知识,为我们进一步了解面向对象程序设计的思想精髓奠定了基础。
2.对构造函数和析构函数的分析
构造函数
CCreateLine::CCreateLine(): m_begin(0,0), m_end(0,0){
m_nStep = 0;// 初始化操作步为 0 }
构造函数:C++中“类”只定义了一组对象的类型。要使用这个类还必须用“类”说明它的对象,每个对象中的数据成员还必须赋初值,这些功能都是由构造函数完成的。此造函数用初始化列表的方式对直线类的私有成员进行初始化,同时记下操作步m_nStep是直线类从指令类中继承来的成员,它在指令类中属于保护成员,在直线类中则成为私有成员。这是数据共享与数据保护两者兼顾时的一种处理方法。
析构函数
CCreateLine::~CCreateLine(){ } 它是构造函数的配对物,与构造函数一样是与类同名的成员函数,并在函数名前加上一个’~’以便与构造函数相区别。此析构函数中没有任何操作语句,但它并非没有任何操作。在任何一个对象消失时都要调用本类的析构函数进行扫尾工作。在构造对象时,构造函数分配资源给程序,在对象作用结束后,这些资源的释放就要靠析构函数。当然析构函数中也是可以有语句的,当需要在对象消失之前执行某种操作时,可以把语句写在里边。
3.继承和虚函数分析
cla CDrawRect : public CDrawObj { protected: DECLARE_SERIAL(CDrawRect);CDrawRect();
public: CDrawRect(const CRect& position);//添加了对新数据成员的初始化
// Implementation public: virtual void Serialize(CArchive& ar);//添加了对新数据成员操作 virtual void Draw(CDC* pDC);//根据要求画出每个图形
virtual int GetHandleCount();//line和roundRectangle特殊处理 virtual CPoint GetHandle(int nHandle);//line和roundRectangle特殊处理
virtual HCURSOR GetHandleCursor(int nHandle);//line和roundRectangle特殊处理
virtual void MoveHandleTo(int nHandle, CPoint point, CDrawView* pView = NULL);//通过特征点来修改大小
virtual BOOL Intersects(const CRect& rect);//判断与图形是否存在相交
virtual CDrawObj* Clone(CDrawDoc* pDoc);//Clone一个新对象加入到pDoc中
protected: enum Shape { rectangle, roundRectangle, ellipse, line };Shape m_nShape;//通过枚举变量来标示属于上述四种的哪一种形状 CPoint m_roundne;// for roundRect corners
friend cla CRectTool;};在阅读此函数的源代码过程中,我感觉到对基类中虚函数的使用对整个程序具有着十分重要的意义。正如上段代码,它的前提是派生类CDrawRect对基类CDrawObj进行了继承,只有在对基类中的虚函数进行设置后,我们才能更加高效地处理和使用基类和派生类中的方法。所以,我感觉到在学习面向对象程序设计时,应当尤为注意基类中虚方法的创建和后期调用。
六、个人学习体会
在学习C++以前,我认为C++只是在C语言的基础上的一种延伸,认为只要学过C语言,就可以用C语言的那种设计思想来学习C++、设计C++程序。正是由于抱了这种错误的思想,使我在一开始学习C++的时候遇到了很大的困难,我没有办法体会面向对象的设计思想,我在学习这门课的时候老是想着实现这个函数功能的具体过程,而没太注意对象分类的重要性。
随着课程学习的深入,我感觉到了利用类和对象、继承、封装等一系列知识可以把我们程序中很多繁杂、重复的部分省略掉,还可以解决一些利用面向过程的设计思想无法解决的问题,我自己也试着编写一些小的C++程序,当然在这个过程中遇到了很多困难,其中调试带来的困难让我无法忘记,在调试程序的同时,我也总结出来了一些调试的小技巧,让我在C语言课程设计中也受用匪浅。
在学习这门课的过程中,我感受到了自己亲自动手编程序、调程序的重要性,我们要熟悉C++的语法、体会调试的思想,最好的一个手段就是自己动手编程、调试,这会比我们一味的看书效果好得多。
另外,我还感觉到一个好的程序编出来需要很多人的团结合作。我在检查自己编写的程序是否有BUG未被找出的时候,我会让我的同学作为一个程序使用者来找出未发现的BUG并提出改进意见,这让我们的工作更加高效。
很高兴能够了解到C++的神奇魅力和面向对象程序设计的独特思想,它为我今后的程序设计奠定了基础。感谢老师对我们的悉心教授!