C++之友元成员

友元成员分类:

1.友元函数

如果把一个独立函数说明为类的友元,则该函数成为类的友元函数,友元函数可以访问类的私有变量。
一般模板为:friend 函数原型声明;示例如下:

#include <iostream>
using namespace std;
class student{
	private:
		int id,score;
		char *name;
	public:
		void play_information();//显示学生学号、姓名、成绩
		friend void set_inform(student &stu,int id,char *name,int score);//友元函数说明
};
void student::play_information()
{
	cout<<"学号:"<<id<<'\t'<<"姓名:"<<name<<'\t'<<"成绩:"<<score<<endl;
}
void set_inform(student &stu,int id,char *name,int score)//学生信息录入
{
	stu.id = id;
	stu.name = name;
	stu.score = score;
}
void main()
{
	student stu;
	set_inform(stu,1001,"陈  红",100);
	stu.play_information();
}
运行结果:学号:1001      姓名:陈  红    成绩:100

程序说明:在本例中,独立函数set_inform(student &stu,int id,char *name,int score)即为友元函数,可以访问对象stu的私有变量。

2.友元成员函数

友元成员函数是类之间而言的,即一个类teacher中的成员函数在另一个类student中被声明为友元,则该函数被称为友元成员函数,且类teacher中的该函数可以访问student中的成员变量。
一般模板为:friend 返回值类型 所属类名::函数名(参数);示例如下:

#include <iostream>
using namespace std;
class student;
class teacher{
public:
	void set_inform(student &stu, int id, char *name, int score);
	void show_inform(student stu);
};

class student{
private:
	int id, score;
	char *name;	
public:
	friend void teacher::set_inform(student &stu, int id, char *name, int score);//友元成员函数说明
	friend void teacher::show_inform(student stu);//友元成员函数说明
};

void teacher::set_inform(student &stu, int id, char *name, int score)
{
	stu.id = id;
	stu.name = name;
	stu.score = score;
}
void teacher::show_inform(student stu)
{
	cout << "学号:" << stu.id << '\t' << "姓名:" << stu.name << '\t' << "成绩:" << stu.score << endl;
}

void main()
{
	student stu;
	teacher teach;
	teach.set_inform(stu, 1002, "张大山", 99);
	teach.show_inform(stu);
}
运行结果:
	学号:1002      姓名:张大山    成绩:99

程序说明:在本例中teacher中的两个成员函数set_inform(student &stu, int id, char *name, int score)show_inform(student stu)都在student中被声明为友元,因此这两个函数都是友元函数,均可访问student中的私有成员变量。
注:友元成员函数在visual2013中会出现问题,表现在IntelliSense显示红色波浪线的警告,友元成员函数在定义过程中调用另一个类的私有变量时显示警告,如stu.id = id; stu.name = name; stu.score = score;均会有红色波浪线提示不可访问,但是并不影响程序的正常编译,也就是程序可以运行。(很多教材中并没有提及友元成员函数,我想这里示例中的IntelliSense波浪线警告可以看出这种写法不太合适,后来百度上某位大佬指点说是微软不支持这种写法,具体原因见:https://zhidao.baidu.com/question/1303726966589368499.html

3.友元类

友元类是两个类之间的关系,若某一类teacher是另一个类student的友元,则类teacher中的成员函数可以访问student类中的变量。
一般模板为:friend class 类名;示例如下:

#include <iostream>
class student{
private:
	int id, score;
	char *name;
	friend class teacher;//声明友元类 teacher
};

class teacher{
private:
	
public:
	void set_score(student &stu);
	void play_score(student &stu);
};

void teacher::set_score(student &stu)
{
	char *na = new char[20];//动态申请空间
	int d, x;
	std::cout << "please enter the information:";
	std::cin >> d >> na >> x;//依次输入学号、姓名、成绩
	stu.id = d;
	stu.name = na;
	stu.score = x;
}

void teacher::play_score(student &stu)
{
	std::cout << "学号\t" << "姓名\t" << "成绩" << std::endl;
	std::cout << stu.id << '\t' << stu.name << '\t' << stu.score << std::endl;
}

void main()
{
	student stu;
	teacher t;
	t.set_score(stu);
	t.play_score(stu);
}
运行结果:
	please enter the information:1001 陈红 100
	学号    姓名    成绩
	1001    陈红    100

程序说明:teacher类是student的友元类,所以teacher类中的两个成员函数都可以访问student中的变量并对所申明的相关对象进行定义操作。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CYH00_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值