友元成员分类:
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
中的变量并对所申明的相关对象进行定义操作。