程序实践系列(五)引用和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
- 程序实践系列(五)引用和friend
- 程序实践系列(六)运算符重载 "+" 和"-"
- 程序实践系列(九)多态性和虚函数
- C++语言笔记系列之五——引用(&)和this指针详解
- 程序实践系列(七)C++概述
- 友元friend和继承(C++)
- 程序实践系列(八)继承与派生
- 程序实践系列(十):C++流和文件流
- Java实践(五)——类的声明与引用
- 引用(五)
- Python学习笔记(五)Python动态类型和引用
- JavaScript基础(五)--- 基本数据类型和引用数据类型
- JAVA面试题解惑系列(五)——传了值还是传了引用?
- JAVA面试题解惑系列(五)——传了值还是传了引用?
- JAVA面试题解惑系列(五)——传了值还是传了引用?
- JAVA面试题解惑系列(五)——传了值还是传了引用?
- JAVA面试题解惑系列(五)——传了值还是传了引用?
- JAVA面试题解惑系列(五)——传了值还是传了引用?
- oc 数组常用函数随堂笔记
- 有上下界的网络流
- 女人的聚会
- pwm驱动接口编写
- C printf() 详解——printf('%08x',number); 程序员面试宝典中的一个错误 char * b=(char *)&a
- 程序实践系列(五)引用和friend
- Android 计算字符串显示在屏幕上的宽度值
- 字符串处理基础算法-KMP
- eclipse中修改web项目名称
- myeclipse 8.6 安装svn插件
- 20141010
- UIButton不能响应或者在模拟器可以响应真机不能响应的诡异问题
- Java 深度历险 读书总结(二)
- 讲讲volatile的作用