文章目录
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.