友元友元类

本文介绍了两种不同的方法计算学生平均成绩,一种使用静态成员,另一种使用友元函数。还展示了如何在类中实现类型转换以及友元类的概念,通过友元类实现日期和时间的联合输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:静态成员-计算平均成绩1

总时间限制: 10000ms 内存限制: 10000kB
描述
Student类包含私有数据成员学生姓名、成绩、总人数、总成绩;成员函数sum()计算总人数和总成绩;成员函数aver()计算n个学生的平均成绩。补充完成下列程序。

#include

using namespace std;

class Student //补充代码

int Student::sum_score=0;

int Student::count=0;

int main()

{

   Student stu[5] ={Student("Ma",89),Student("Hu",90),Student("LU",95),

        Student("Li",88),Student("Gao",75)};

   for(int i=0;i<5;i++)

          stu[i].sum();

   cout<<"Average="<<Student::aver()<<endl;

}
输入

输出
Average=87.4

AC代码

#include<iostream>
#include<string.h>
using namespace std;
class Student   
{
	char name[20];
	int score;
	static int sum_score;
	static int count;
	public:
	Student(const char *a,int c)
	{
		score=c;
		strcpy(name,a);
		count++;
	}
	void sum()
	{
		sum_score +=score;
	}
	static double aver()
	{
		return 1.0*sum_score/count;
	}
};
int Student::sum_score=0;
int Student::count=0;
int main()
{
	Student stu[5] ={Student("Ma",89),Student("Hu",90),Student("LU",95),
        Student("Li",88),Student("Gao",75)};
	for(int i=0;i<5;i++)
	{
		stu[i].sum();
	}
    cout<<"Average="<<Student::aver()<<endl;
}

2:友元函数-计算平均成绩2

总时间限制: 10000ms 内存限制: 10000kB
描述
Student类包含私有数据成员学生姓名、成绩。全局函数sum()计算总人数、总成绩;全局函数aver()计算n个学生的平均成绩(函数参数自己设定)。补充完成下列程序。

#include

using namespace std;

static int sum_score=0, count=0;

//补充代码

int main()

{

   Student stu[5] ={Student("Ma",89),Student("Hu",90),Student("LU",95),

        Student("Li",88),Student("Gao",75)};

   for(int i=0;i<5;i++)

          sum(stu[i]);

cout<<sum_score<<"," <<count<<endl;

   cout<<"Average="<<aver()<<endl;

}

输入

输出
437,5
Average=87.4

AC代码

#include<iostream>
#include<string.h>
using namespace std;
static int sum_score=0, count=0;
class Student
{
	char name[20];
	int score;
	public:
		Student(const char*a,int b)
		{
			score=b;
			strcpy(name,a);
			count++;	 
		}
		friend void sum(Student& s);
};
void sum(Student& s)
{
	sum_score +=s.score;
}
double aver()
{
	return 1.0*sum_score/count;
}

int main()

{
    Student stu[5] ={Student("Ma",89),Student("Hu",90),Student("LU",95),
        Student("Li",88),Student("Gao",75)};
    for(int i=0;i<5;i++)
	{
		sum(stu[i]);
	}
    cout<<sum_score<<"," <<count<<endl;
    cout<<"Average="<<aver()<<endl;
}

3:类与基本类型的转化

总时间限制: 10000ms 内存限制: 65535kB
描述
定义一个Point类,有私有数据成员,double型变量x和y,定义相关构造函数,定义类型转化函数可将Point类对象转化为坐标距离原点距离(double型)并进行计算,主函数计算并显示两个Point对象的差绝对值。

输入
两组坐标
输出
两个坐标点距离原点距离差
样例输入
3 4
5 6
样例输出
2.81025

#include<iostream>
#include<math.h>
using namespace std;
class Point{
	private:
		double x,y;
	public:
	operator double()//隐式类型转换
	{
		return sqrt(x*x+y*y);
	}
	Point(double x,double y) 
	{
		Point::x=x;
		Point::y=y;
	}
};
int main()
{
	double a,b,c,d,len;
	cin>>a>>b>>c>>d;
	Point p1(a,b),p2(c,d);
	len = p1-p2;
	if(len<0) len = -len;
	cout<<len<<endl;
	return 0;
}

4:友元类

总时间限制: 10000ms 内存限制: 10000kB
描述
定义MyTime类,完成时间(包括私有成员小时、分钟、秒)的初始化;定义MyDate类,完成日期的初始化(包括私有成员年、月、日);且MyDate类是MyTime友元类。调用MyDate类的成员函数Display一次性输出日期和时间。

#include

using namespace std;

//补充代码

int main()

{

   MyTime t(10,30,45);

   MyDate d(4,20);
   
   d.Diaplay(t);

}

输入

输出
2021/4/20 10:30:45

作为一个小five,我刚开始不会写,所以强行忽略题干强行写
代码如下

#include<iostream>
using namespace std;
class MyDate {
	friend class MyTime;
	private:
		int month,day;
	public:
		MyDate(int m,int d) {
			//year=y;
			month=m;
			day=d;
		}
		int output1()
		{
			cout<<"2021"<<"/"<<month<<"/"<<day<<" ";
		}
};
class MyTime {
	private:
		int s,f,m;
	public:
		MyTime(int o,int p,int q) {
			s=o;
			f=p;
			m=q;
		}
		int output2()
		{
			cout<<s<<":"<<f<<":"<<m<<endl;
		}
};

int main() {
	MyTime t(10,30,45);
	MyDate d(4,20);
	d.output1();
	t.output2();
	return 0;
}

但是!怎么可以这么堕落呢!我认真研究了一会儿,AC啦!
AC代码

#include<iostream>
using namespace std;
class MyTime;
class MyDate{
	private:
		int month,day;
	public:
		MyDate(int m,int d) {
			MyDate::month=m;
			MyDate::day=d;
		}
		void Diaplay(MyTime &);		
};
class MyTime {
	private:
		int s,f,m;
	public:
		MyTime(int o,int p,int q) {
			MyTime::s=o;
			MyTime::f=p;
			MyTime::m=q;
		}
		friend void MyDate::Diaplay(MyTime &);	
};
void MyDate::Diaplay(MyTime &x)
{
	cout<<"2021"<<"/"<<month<<"/"<<day<<" ";
	cout<<x.s<<":"<<x.f<<":"<<x.m<<endl;
	//注意这里打x.的时候不会弹出s、f、m,不用害怕 
}

int main() {
	MyTime t(10,30,45);
	MyDate d(4,20);
	d.Diaplay(t);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值