友元函数:
public、protected、private:
只要让func成为类Man的友元函数,那么func这个函数就可以访问Man的所有成员,private,protected,public
//Man.h
class Man{
private:
int Age;
friend void func(const Man &temp_man); //不属于类,不受public、private、protected的影响
};
//func.h
#ifndef __FUNC__
#def __FUNC__
#include "Man.h"
#include <iostream>
void func(const Man &temp_man);
#endif
//------------------------------------------------------------------
//func.cpp
#include "func.h"
void func(const Man&temp_man){
cout << "test" << endl;
}
这个函数不属于类,所以不受public、protected、private的影响
总结:友元函数func():通过声明为友元函数,它就能访问这个类的所有成员,包括public、protected、private
友元类:类 可以把其他的类定义成友元类。如果你是我的友元类,那么你就可以在你的成员函数中访问我的所有成员
class A{
private:
int data;
};
class B{
public:
void callA(int x, A &a){
a.data = x; //报错,无法访问
cout << a.data << endl;
}
};
我们修改类A,使得类B成为类A的友元类。
Class B; //声明
class A{
private:
int data;
friend class B; //这就是友元类的声明,虽然此时B没有定义但是系统没有报错,如果报错可以加一个类B声明
};
class B{
public:
void callA(int x, A &a){
a.data = x;
cout << a.data << endl;
}
};
注意:
每个类自己负责自己的友元类和友元函数;
有缘关系不能被继承;
友元关系是单向的,比如上边类B是类A的友元类,但这并不表示类A是类B的友元类;
友元关系没有传递性,比如B是A的友元类,C是B的友元类,这并不代表C是A的友元类。
友元成员函数:
写这种友元成员函数(必须是public权限)必须要有代码组织结构,因为这里边有声明和定义这种依赖关系。
//A.h
#include "B.h"
class A{
private:
int data;
int name;
friend void B::callA(int x, A &a); //友元成员函数
};
//B.h
class A;
class B{
public:
void callA(int x, A &a){
a.data = x;
}
};
//file.cpp
#include "A.h"
#include "B.h"
int main(){
A a;
B b;
b.callA(1, a);
}
优点:允许在特定情况下,某些非成员函数访问类的protected,private成员,从而提出友元这个概念;使访问protected与private成员更灵活。
缺点:破坏了类的封装性,降低了类的可靠性和维护性。