程序实践系列(五)引用和friend

来源:互联网 发布:有答案中级java面试题 编辑:程序博客网 时间:2024/05/17 08:39

1. 设计一个类CSample

它有一个私有数据成员n,建立该类的4个对象,即s1(n=10)、 s2(n=20)、s3(n=30)和s4(n=40),建立一个成员函数实现这些对象n值的累加,但要求不使用静态数据成员,而且对象自已不能与自己相加。

 解:在CSampale类中设计一个成员函数add(),其参数为Sample对象引用,用于累加对象n值。

参考程序:

#include <iostream>using namespace std; class CSample {  int n; public:CSample() {}  CSample(int i) { n=i; }  void add(CSample &s)      //对象引用作为参数  {   if (&s==this)     //不能自已相加,this是当前对象的指针    cout << "不能与自己相加" << endl;   else    n+=s.n;  }  void disp() { cout << "n=" << n << endl; } }; int main( ) {  CSample s1(10),s2(20),s3(30),s4(40);  s1.add(s2);  s1.add(s3);  s1.add(s4); s1.disp();  s1.add(s1); return 0;} 

测试结果


2. 设计一个日期类CDate

其中包括日期的年份、月份和日号,编写一个友元函数求两个日期之间相差的天数。

解:该类中设计3个友元函数:count_day()函数,它有两个参数,第2个参数是一个标志,当其值等于1时,计算一年的开始到某日期的天数,否则计算某日期到年尾的天数;leap()函数用于判断指定的年份是否为闰年;subs()函数用于计算两个日期之间的天数。

参考程序:

#include <iostream> using namespace std; class CDate  {   int year; //年   int month; //月   int day; //日    public:   CDate(int y,int m,int d)//:year(y),month(m),day(d)  //构造函数   {    year=y;    month=m;day=d;   }     void disp()   {    cout << year << "." << month << "." << day << endl;   }       friend int count_day(CDate &d,int); //友元函数说明       friend int leap(int year);   //友元函数说明    friend int subs(CDate d1,CDate d2); //友元函数说明  };   int count_day(CDate &d,int flag)  //友元函数定义  {     static int day_tab[2][12]={  {31,28,31,30,31,30,31,31,30,31,30,31},       {31,29,31,30,31,30,31,31,30,31,30,31}};               //使用二维数组存放各月天数,第一行对应非闰年,第二行对应闰年       int p,i,s;       if (leap(d.year))    p=1; //闰年时使用day_tab数组的第二行数据       else       p=0;  //不是闰年时使用day_tab数组的第一行数据       if (flag)        {    s=d.day;for (i=1;i<d.month;i++)    s+=day_tab[p][i-1];   }  else     {     s=day_tab[p][d.month]-d.day;          for (i=d.month+1;i<=12;i++)    s+=day_tab[p][i-1];  }     return(s); }  int leap(int year) //友元函数定义  {      if (year%4==0 && year%100!=0 || year%400==0)  //是闰年   return 1;     else                         //不是闰年      return 0;  }   int subs(CDate d1,CDate d2) //友元函数定义  { int days,day1,day2,y;      if (d1.year<d2.year)      {days=count_day(d1,0);          for (y=d1.year+1;y<d2.year;y++)     if (leap(y))     days+=366L;else     days+=365L;            days+=count_day(d2,1);    }       else if (d1.year==d2.year)    {     day1=count_day(d1,1);         day2=count_day(d2,1);         days=day2-day1;    }    else //d1.year>d2.year    {     days=count_day(d2,0);            for (y=d2.year+1;y<d1.year;y++)      if (leap(y))     days+=366L;             else     days+=365L;            days+=count_day(d1,1);    }    return days; } int main(){  CDate d1(2014,10,10),d2(2025,11,12);  int ds1=subs(d1,d2),ds2=subs(d2,d1);  cout << "日期d1:";d1.disp();  cout << "日期d2:";d2.disp();  cout << "d1和d2相距" << ds1 << "天" << endl;  cout << "d2和d1相距" << ds2 << "天" << endl; return 0;} 

测试结果


关于Image Engineering& Computer Vision更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.


0 0