【C++面向对象】3. 友元

  • 友元可以理解为 原类 的 朋友,友元(友元函数和友元类)不是原类的成员友元可以访问 原类 的 所有 成员
  • 友元可以是一个函数,该函数被称为 友元函数;友元也可以是一个类,该类被称为 友元类

【 1. 友元函数 】

  • 类的 友元函数定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员,即 可以访问类的所有成员
  • 友元函数并不是成员函数,但是需要在原类的定义中用 关键字 friend 声明。如下所示:
class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box ); //声明 printWidth 函数是类 Box 的友元函数
   void setWidth( double wid );
};
  • 实例
#include <iostream>

using namespace std;

class Box
{
   double width;
   public:
   	friend void printWidth( Box box ); // 友元函数
   	void setWidth( double wid );
};

// 成员函数定义
void Box::setWidth( double wid )
{
    width = wid;
}

// 友元函数定义
void printWidth( Box box )
{
   /* 请注意:printWidth() 不是任何类的成员函数,
   因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
   cout << "Width of box : " << box.width <<endl;
}

// 程序的主函数
int main( )
{
   Box box;
   // 使用成员函数设置宽度
   box.setWidth(10.0);
   // 使用友元函数输出宽度
   printWidth( box );
   return 0;
}

在这里插入图片描述

【 2. 友元类 】

  • 整个友元类及其所有成员都是友元,友元类中的成员可以访问原类中的所有成员
  • 友元类不是成员,但是需要 在 原类 定义的内部用关键字 friend class 进行声明,如下所示:
class CStudents
{
	private:
		char ID[100];
		char Name[100];
		double Score;
	public:
		CStudents(const char* ,const char * ,double);
		CStudents();
		friend void Display1(CStudents&);
		friend class CTeacher;   // 声明 CTeacher 类是 CStudents类的友元类
};

2.1 实例1 - 单个文件

  • 类myphone 是 类phone 的友元类,myphone类的成员可以直接访问类phone的所有成员。
#include<iostream>
using namespace std;
class phone 
{
	friend class myphone;
	private:
		int price;
	public:
		phone(int x	) 
			{ price = x;}
};
class myphone 
{
	private:
		phone a;
	public:
		myphone(int x) :a(x) {}
		int getprice() 
		{ return a.price;}
};
int main() 
{
	int p;
	cin >> p;
	myphone a(p);
	cout << a.getprice();
	return 0;
}

在这里插入图片描述

2.2 实例2 - 多个文件

  • 实例
// CStudents.h
#pragma once
#include<iostream>
using namespace std;

class CStudents
{
	private:
		char ID[100];
		char Name[100];
		double Score;
	public:
		CStudents(const char* ,const char * ,double);
		CStudents();
		friend void Display1(CStudents&); // Display1 函数是CStudents类的友元函数
		friend class CTeacher; // CTeacher 类是 CStudents类的友元类
};
class CTeacher 
{
	public:
		char* GetName(CStudents& Temp) //获取
		{
			return Temp.Name; //因为是友元类,友元类的成员函数也是友元,可以访问原类的所有成员。
		}

		void Modify(CStudents& Temp) //实现对学生的成绩的修改;
		{
			cin  >> Temp.Score;
		}

		void Display2(CStudents& Temp)const// 输出s成绩的等级;
		{
			double x = Temp.Score;
			if (x < 60)						cout << "不及格"<< endl;
			else if (x >= 60 && x <= 69)	cout << "及格"  << endl;
			else if (x >= 70 && x <= 79)	cout << "中等"  << endl;
			else if (x >= 80 && x <= 89)	cout << "良好"  << endl;
			else							cout << "优秀"  << endl;
		}
};
// CStudents.cpp
#include "CStudents.h"
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;

//构造函数1,赋默认值
CStudents::CStudents():ID("1024"), Name("MR_Promethus"),Score(100)
{
};

//构造函数2,赋给定值
CStudents::CStudents(const char * MyId,const char *MyName,double MyScore) 
{
	strcpy_s(ID, MyId) ;
	strcpy_s(Name,MyName);
	Score = MyScore;
};

//类 CStudents 的友元函数
void Display1(CStudents& Temp)
{
	double x = Temp.Score;
	if (x < 60)						cout << Temp.Name << "\t" << Temp.Score << "\t" <<"不及格"<< "\t" << endl;
	else if (x >= 60 && x <= 69)	cout << Temp.Name << "\t" << Temp.Score << "\t" << "及格" << "\t" << endl;
	else if (x >= 70 && x <= 79)	cout << Temp.Name << "\t" << Temp.Score << "\t" << "中等" << "\t" << endl;
	else if (x >= 80 && x <= 89)    cout << Temp.Name << "\t" << Temp.Score << "\t" << "良好" << "\t" << endl;
	else							cout << Temp.Name << "\t" << Temp.Score << "\t" << "优秀" << "\t" << endl;
}
//Main.cpp
#include<iostream>
#include"CStudents.h"
#include<cstring>
using namespace std;

int main(void)
{
	int i;
	char temp[100];
	int flag = 0;
	int cunzai;
	int j;
	CTeacher teach;         // 友元类teach
	CStudents s[4] =        // 类数组,数组中每一个元素都是一个类
	{
		{"01","LeBron Jams",90},
		{"02","Michael Jordan",98},
		{"03","Chris Bosh",95},
		{"04","Stephen Curry",96}
	};
	for (i = 0; i < 4; ++i)
	{
		Display1(s[i]);
	}
	cout << "请输入要修改成绩的姓名" << endl;
	cin.getline( temp,20) ;

	for (i = 0; i < 4; ++i)
	{
		flag = 0;
		for(j=0;temp[j]!= teach.GetName(s[i])[j];++j)
		{
			flag = 1;
		}
		if (flag == 0) { cunzai = i;break; };
	}
	if (flag==0)
	{
		cout << "请输入成绩:" ;
		teach.Modify(s[cunzai]);
		teach.Display2(s[cunzai]);
	}
	if(flag==1)
		cout << "此人不存在" << endl;
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值