在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问,这是很方便做到的。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符不可能为类的成员。
然而,尽管不是类的成员,它们仍是类的“接口的组成部分”。友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。
测试代码:
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
friend class Teacher;
Student(int age1,string name1)
{
age = age1;
name =name1;
}
private:
int age;
string name;
};
class Teacher
{
public:
void printStudent(Student &student);
private:
int age;
string name;
};
void Teacher::printStudent(Student &student)
{
cout<<student.age<<endl;
cout<<student.name<<endl;
}
int main()
{
Student a(19,"ZhangQiang");
Teacher b;
b.printStudent(a);
return 0;
}
输出结果:
tekken@tekken:~/C++WS$ ./a.out
19
ZhangQiang
也可以单独读函数进行友元处理:
(当我们将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定。)
更一般地讲,必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。
测试代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student; //提前声明
class Teacher
{
public:
void printStudent(Student &student); //只对成员函数进行友元
void printStudent_test(Student &student); //只对成员函数进行友元
private:
int age;
string name;
};
class Student
{
public:
friend void Teacher::printStudent(Student &student);
friend void Teacher::printStudent_test(Student &student);
Student(int age1,string name1)
{
age = age1;
name =name1;
}
private:
int age;
string name;
};
void Teacher::printStudent(Student &student)
{
cout<<student.age<<endl;
cout<<student.name<<endl;
}
void Teacher::printStudent_test(Student &student)
{
cout<<student.age<<endl;
cout<<student.name<<endl;
}
int main()
{
Student a(19,"ZhangQiang");
Teacher b;
b.printStudent(a);
b.printStudent_test(a);
return 0;
}
输出结果:
tekken@tekken:~/C++WS$ ./a.out
19
ZhangQiang
19
ZhangQiang
网友评论