现在的位置: 首页 > 综合 > 正文

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

2019年03月20日 ⁄ 综合 ⁄ 共 2200字 ⁄ 字号 评论关闭
文章目录

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.

抱歉!评论已关闭.