《C++程序设计》上机指导2
实验四、面向对象的妥协(2学时)
一、实验目的
1.掌握友元的概念、友元函数的定义与使用方法。
2.掌握静态数据成员与静态成员函数的定义与使用方法。
二、实验内容
1.设计并测试点类Point,其数据成员是直角坐标系的点坐标,友元函数distance用来计算两点间的距离。
2.设计一个书类Book,能够保存书名、定价,所有书的本数和总价。
实验五、运算符重载(2学时)
一、实验目的
1.掌握运算符重载的规则。
2.掌握几种常用的运算符重载的方法。
3.了解转换构造函数的使用方法。
4.了解在Visual C++6.0环境下进行运算符重载要注意的问题。
二、实验内容
1.阅读下面的程序,写出程序运行的结果。
(1)
#include<iostream.h>
class ABC{
    int a,b,c;
public:
    ABC(int x,int y,int z):a(x),b(y),c(z){}
    friend ostream &operator<<(ostream &out,ABC& f);
};
ostream &operator<<(ostream &out,ABC& f)
{
    out<<"a="<<f.a<<endl<<"b="<<f.b<<endl<<"c="<<f.c<<endl;
    return out;
}
int main(){
    ABC obj(10,20,30);
    cout<<obj;
    return 0;
}
(2)
#include<iostream.h>
class Number{
    int n;
public:
    Number(int x):n(x){}
    Number& operator++(){ ++n;    return *this;    }
    Number& operator++(int){    n++;        return *this;}
    friend Number &operator--(Number &o);
    friend Number &operator--(Number o,int);
    void display(){cout<<"This Number is:  "<<n<<endl;}
};
Number &operator--(Number &o){--o.n;    return o;    }
Number &operator--(Number o,int){o.n--;    return o;    }
int main(){
    Number N1(10);
    ++ ++ ++N1;
    N1.display();
    N1++;
    N1.display();
    --N1;
    N1.display();
    N1-- -- --;
    N1.display();
    return 0;
}   
2.设计并实现一个日期类Date,要求:
(1)可以建立具有指定日期(年、月、日)的Date对象,默认日期是2009.1.1。
(2)可以从输出流输出一个格式为“年-月-日”的日期,其中年是四位数据,月、日可以是一位也可以是两位数据。
(3)可以动态地设置年、月、日。
(4)可以用运算符= =、!=、<和>对两个日期进行比较。
(5)可以用运算符++、--、+=、-=等完成天数的加减一天或若干天的操作
(6)Date类必须能够正确表达日期,不会出现类似于13月,32日一类的情况。Date类还必须处理闰年的问题,闰年包括:所有能被400整除的年份,以及能被4整除同时又不能被100整除的年份。
(7)写出主函数对该类进行测试。
3.下面是一个数组类CArray的定义。要求:
(1)在此基础上增加print()成员函数打印数组,
(2)重载“=”、“+”、“-” 运算符使之能对该数组类对象进行赋值、加减运算。
(3)写出主函数对该类进行测试。
class CArray
{private:
  int* p_arr;
  int size;
public:
  CArray(); //缺省构造函数
  CArray(int* p_a,int s); //构造函数
  CArray(const CArray &r_other);//复制构造函数
  ~CArray();//析构函数
  int operator[](int pos) const; //访问数组元素值的下标运算符重载函数 
  int& operator[](int pos); //设置数组元素值的下标运算符重载函数
  Carray &operator=(const Carray &other)//赋值运算符“=”重载函数
  Carray &operator+(const Carray &other) //加运算符“=”重载函数
  Carray &operator-(const Carray &other) //减运算符“=”重载函数
  void print() const;
};
CArray:: CArray() {  p_arr=NULL;  size=0;} 
CArray:: CArray(int* p_a,int s)
{
    if(s>0)
    {  size=s; p_arr=new int[size];
        for(int i=0;i<size;i++)  p_arr[i]=p_a[i];
    }
    Else
    {  p_arr=NULL;  size=0; }
}
CArray::CArray(const CArray &r_other)
{  size=r_other.size;
    if(size)
    {  p_arr=new int[size];
        for(int i=0;i<size;i++)  p_arr[i]=r_other.p_arr[i];
    } 
}
CArray::~CArray()
{    if(p_arr) delete[] p_arr;
    p_arr=NULL;  size=0;
}
int CArray::operator[](int pos) const
{
  if(pos>=size) return p_arr[size-1];
  if(pos<0) return p_arr[0];
  return p_arr[pos];
}
int& CArray::operator[](int pos)
{
  if(pos>=size) return p_arr[size-1];
  if(pos<0) return p_arr[0];
  return p_arr[pos];
}
4.下面是一个自定义字符串类的声明。请写出该类所有成员函数的类外定义代码。
class string
{private:
unsigned buflen;
char * buffer;
public:
string();//构造函数
string(unsigned);
string(char);
string(const char*);
string(const string &);//复制构造函数
~string();//析构函数
//重载赋值运算符
string& operator=(const string &right);
string& operator+=(const string &right);
char *operator+=(const char *right);
friend string operator+(const string & left,const string & right); //字符串连接
string operator()(unsigned start,unsigned len); //取子串
unsigned length()const; //求字符串长度
char & operator[](unsigned index)const; //访问单个字符
int compare(const string &)const; //字符串比较
operator const char *()const; //到普通c字符串的转换
friend ostream & operator<<(ostream &,string &);//字符串的输出
};
实验六、继承与聚集(4学时)
一、实验目的
1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合
二、实验内容
1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)
#include <iostream>
using namespace std;
  class A
析构函数的定义
  {public:
    A(){cout<<"A::A() called.\n";}
    virtual ~A(){cout<<"A::~A() called.\n";}
  };
  class B:public A
  { public:
    B(int i)
{  cout<<"B::B() called.\n";
        buf=new char[i];
      }
      virtual ~B()
{  delete []buf;
        cout<<"B::~B() called.\n";
      }
  private:
    char *buf;
  };
  void fun(A *a)
{  cout<<"May you succeed!"
    delete a;
  }
  int main()
{ A *a=new B(15);
    fun(a);
      return 0;
}
(2)
#include<iostream>
using namespace std;
class A{
public:
    A(int a,int b):x(a),y(b){ cout<<""<<endl;    }
    void Add(int a,int b){ x+=a;y+=b;}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。