【OOP】实验3 封装性
作者:3sbase | 发布时间:2016/3/19

一、实验类型

    设计型

二、实验目的与要求

1、实验目的

    练习面向对象的封装性

2、实验要求

掌握类和对象的定义和使用;理解静态成员和友元;掌握函数重载和运算符重载。

三、上机准备

1、实验室安装VC++6.0软件。

2、复习教材8章的内容。

四、实验内容

1、类和对象的定义和使用

(1)定义一个圆类(CCircle

class CCircle

{

private:

    float fRadius;

public:

    bool bVisible;

public:

    void SetRadius(float radius);

    float Area();

    bool isVisible();

    static void Define();

private:

    void Show();

};

将函数的声明放在头文件(CCircle.h)中,函数的实现放在源文件(CCircle.cpp)中。

(2)新建一个C++源文件,在其中使用圆类,分析运行结果。

#include"CCircle.h"

#include<iostream>

using namespace std;

 

void main()

{

    CCircle cc;

    cc.SetRadius(10);

    cout<<"圆的面积:"<<cc.Area()<<endl;

//  cc.Show();

    cc.bVisible=false;

    cout<<cc.isVisible()<<endl;

    cc.Define();

    CCircle::Define();

}将注释去掉,分析出错原因,同时理解main()函数中各个语句的作用,以注释的方式加在语句结束处,将main()函数及关于语句作用的注释写入实验报告。

2、构造函数和析构函数

去掉void SetRadius(float radius);声明及定义。定义CCircle的构造函数CCircle(int radius);析构函数。修改main()函数使程序能够运行。   

3、修改以上程序中的main()函数,将其中使用对象方式访问数据成员及成员函数改为使用指针的方式访问。同时,将CCircle类中的Area()函数定义为常成员函数。

4、拷贝构造函数和对象赋值(选做)

(1)新建一个新的控制台类型的工程,新建一个C++源文件,键入以下程序,分析运行结果。

#include<iostream>

using namespace std;

class Person{

      char *pName;

public:

      Person(char *pN="noName")

      {

             cout<<"Constructing "<<pN<<"\n";

             pName=new char[strlen(pN)+1];

             if(pName) strcpy(pName,pN);            

      }

      ~Person()

      {

             cout<<"Destructing "<<pName<<"\n";

             delete[] pName;    

      }

 

      };

void main()

{

      Person p1("Randy");

      Person p2(p1);

      }

main()函数中的Person p2(p1);语句改为Person p2;p2=p1;分析运行结果,记入实习报告。

(2)自定义拷贝构造函数和添加赋值操作符

Person中自定义一个拷贝构造函数,如下,在实验报告中记录程序运行结果,并作出分析。

Person(const Person& s)

  {

         cout<<"copy Constructing"<<endl;

         pName=new char[strlen(s.pName)+1];

         if(pName) strcpy(pName,s.pName);

  }

Person中添加一个赋值操作符,实现赋值操作,将main函数的内容改为Person p1(“Randy”); Person p2(“Jenny”);p2=p1;分析运行结果,记入实验报告。

    Person& operator=(Person& s)

{

     cout<<"Assigning"<<s.pName<<"\n";

     if(this==&s) return s;

     delete[] pName;

     pName=new char[strlen(s.pName)+1];

     if(pName) strcpy(pName,s.pName);

     return *this;

}

5、友元函数

A 新建一个控制台类型的空工程FriendTest

B 新建一个C++源文件test.cpppoint.cpp point.h

C 键入如下代码;

point.h

#include<iostream>

using namespace std;

class CPoint{

private:

   int m_x,m_y;

public:

   void SetVal(int x,int y);

   void Print();

};

point.cpp

#include"point.h"

void CPoint::SetVal(int x,int y)

{

   m_x=x;

   m_y=y;

}

void CPoint::Print()

{

   cout<<"Point("<<m_x<<","<<m_y<<")"<<endl;

}

test.cpp

#include"point.h"

void main()

{

   CPoint pt;

   pt.SetVal(10,20);

   pt.Print();

}

要求(1)声明并定义一个友元函数CPoint Inflate(CPoint& pt,int nOffset);该函数实现点坐标的值增加nOffSetm_xm_y均增加)。(2)test.cpp中的第三条语句前插入pt=Inflate(pt,3);运行程序,分析结果,写入实验报告。

6、运算符和函数重载  定义三维坐标类,实现+=++的运算符重载(用成员函数和友元函数两种方式分别实现),同时实现Show函数的重载。

五、实验步骤

1VC++控制台应用程序的建立。

2、编写类和对象的定义和使用程序,分析运行结果。

3、构造函数和析构函数建立。

4、改写函数实现指针的访问方式。

5、实现拷贝构造函数和对象赋值(选做)

6、编写点类,并声明和定义一个友元函数。

7、编写三维坐标类,并实现+=++的运算符重载(两种方式均实现)和显示函数的重载。

六、实验报告

1、对实验内容1根据实验内容要求,分析错误原因,写入实验报告。

2、对实验内容3,将改写后的main()函数中的代码记入实验报告。

3、对实验内容4,根据要求记入实验报告。

4、对实验内容5,根据要求记入实验报告。

5、对实验6以书面形式提交运算符重载(2种方式)及函数重载的程序。