/*
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,
这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。
友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,
友元的声明以friend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:
友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。
通常,将友元声明成组地放在类定义的开始或结尾是个好主意。
*/
#include <iostream>
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个
类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存
取另一个类的私有成员时,可以将该类声明为另一类的友元类。
这里B是A的友元类
*/
class A
{
friend class B;
private:
int n = 1;
};
class B
{
public:
void method_one(A &a) {
cout << "B是A的朋友,第一种方法说出A的学号:" << a.n << endl;
}
void method_two(A &a) {
cout << "B是A的朋友,第二种方法说出A的学号:" << a.n << endl;
}
};
友元函数是指某些虽然不是类成员函数却能够访问类的所有成员的函数。
类授予它的友元特别的访问权,这样该友元函数就能访问到类中的所有成员。
下面method_three 就是友元函数。因为声明在Class C中,所以可以访问
C的私有成员。
**/
class C
{
friend void method_three(C &c);
private:
int n = 2;
};
void method_three(C &c) {
cout << "第三种方法能够说出C的学号:" << c.n << endl;
}
/*3.友元成员函数
下面的例子中
使类D中的成员函数成为类E的友元函数,这样类D的该成员函数就可以访问类E的所有成员了。
当用到友元成员函数时,需注意友元声明和友元定义之间的相互依赖,在该例子中,
类B必须先定义,否则类A就不能将一个B的函数指定为友元。然而,只有在定义了类A之后,
才能定义类B的该成员函数。更一般的讲,必须先定义包含成员函数的类,才能将成员函数设为友元。
*/
class E;
class D {
public:
void method_four(E &e);
};
class E {
private:
int n = 3;
public:
friend void D::method_four(E &e);
};
void D::method_four(E &e) {
cout << "第四种方法既是类D的成员函数同时又是类E的友元函数所以能够说出E的学号:" << e.n << endl;
}
int main() {
class A a;
class B b;
class C c;
class D d;
class E e;
b.method_one(a);
b.method_two(a);
method_three(c);
d.method_four(e);
system("pause");
}
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,
这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。
友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,
友元的声明以friend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:
友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。
通常,将友元声明成组地放在类定义的开始或结尾是个好主意。
*/
#include <iostream>
using namespace std;
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个
类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存
取另一个类的私有成员时,可以将该类声明为另一类的友元类。
这里B是A的友元类
*/
class A
{
friend class B;
private:
int n = 1;
};
class B
{
public:
void method_one(A &a) {
cout << "B是A的朋友,第一种方法说出A的学号:" << a.n << endl;
}
void method_two(A &a) {
cout << "B是A的朋友,第二种方法说出A的学号:" << a.n << endl;
}
};
友元函数是指某些虽然不是类成员函数却能够访问类的所有成员的函数。
类授予它的友元特别的访问权,这样该友元函数就能访问到类中的所有成员。
下面method_three 就是友元函数。因为声明在Class C中,所以可以访问
C的私有成员。
**/
class C
{
friend void method_three(C &c);
private:
int n = 2;
};
void method_three(C &c) {
cout << "第三种方法能够说出C的学号:" << c.n << endl;
}
/*3.友元成员函数
下面的例子中
使类D中的成员函数成为类E的友元函数,这样类D的该成员函数就可以访问类E的所有成员了。
当用到友元成员函数时,需注意友元声明和友元定义之间的相互依赖,在该例子中,
类B必须先定义,否则类A就不能将一个B的函数指定为友元。然而,只有在定义了类A之后,
才能定义类B的该成员函数。更一般的讲,必须先定义包含成员函数的类,才能将成员函数设为友元。
*/
class E;
class D {
public:
void method_four(E &e);
};
class E {
private:
int n = 3;
public:
friend void D::method_four(E &e);
};
void D::method_four(E &e) {
cout << "第四种方法既是类D的成员函数同时又是类E的友元函数所以能够说出E的学号:" << e.n << endl;
}
int main() {
class A a;
class B b;
class C c;
class D d;
class E e;
b.method_one(a);
b.method_two(a);
method_three(c);
d.method_four(e);
system("pause");
}