C++之友元函数和友元类
理解:
因为类的设计是将私有数据进行封装,目的是不能让外部随便访问到本类的私有成元数据,而只能通过本类的成员函数进行访问。但是这样做也会导致我们在代码编写上的不方便,比如需要更加快捷方便的访问到一个类中的成员变量,还可以通过在这个需要被访问的类中定一个friend的方式来访问起私有成员变量。这样外部的函数或者类就能通过这个friend函数的方式直接去访问这个类的私有成员变量了。而不是通过定义这类对象,然后再通过这个类对象的方式来访问。但是有一点需要理解的就是,这个friend函数不能直接去访问那个被访问类中的私有变量,而是需要通过在这个friend函数(外部函数,非这个类的成员函数)中传递该类对象的方式去访问这个类中的私有变量。
顾名思义,友元就是朋友的意思。C++中友元的目的是向其他类开放自己的私有数据,也就是说在其他类中通过原始类的对象直接.星(b.name,b为原始类对象,name为原始类似有成员变量)的方式访问原始类的私有成员,而不是通过原始类对象的共有接口来访问私有成员,从而提高性能,但是她破坏了类的封装性和隐蔽性。所以C++友元是解决这样的场景。所以如果一个原始类要把自己的私有成员开发出来能够在其他类中通过她的对象直接访问的话。这需要把访问这个私有成员的函数在原始类中神明为这个类的友元函数。
#include <iomanip>
#include <chrono>
#include <thread>
using namespacestd;
class A;
class B
{
public:
void print(A & input);
};
class A
{
public:
A():a(100){
}
friendvoid B::print(A & input);//这里声明一个B类中成员函数为A的友元函数,这样B的成员函数可以直接通过A的对象访问A的私有成员。当然这个函数也可以是一个全局函数。
private:
int a;
};
void B::print(A & input)
{
cout<<input.a<<endl;
}
int main()
{
A a;
B b;
b.print(a);
}
同理,如果一个类B是另一个类A的友元类,那么这个类B中的所有成员函数都可以直接通过A类的对象直接访问A类的私有成员。就是这么一个概念。
#include <chrono>
#include <thread>
using namespacestd;
class A;
class B
{
public:
void print(A & input);
};
class A
{
public:
A():a(100){
}
friend B;//这里声明B是A的友元类,这样B的成员函数就可以畅通无阻的访问A的私有成员int a了。
private:
int a;
};
void B::print(A & input)
{
cout<<input.a<<endl;
}
int main()
{
A a;
B b;
b.print(a);
}
#include <iostream>
using namespace std;
class B;
class A{
public:
void Operate(class B &b);
void Show(){
cout<<"A value = "<<value<<endl;
}
private:
int value;
};
class B{
public:
void Add(int a){
value = a;
}
private:
friend class A ;/*如示,如果在一个类中有这样的friend定义,说明申明的那个friend类可以在他定义的成员函数中通过传递这个类(B)对象的方式,来访问到这个类中的私有成员变量,如这里类A可以通过其成员函数访问类B的私有变量value,而不需要B直接暴露接口给A*/
int value;
};
void A::Operate(class B &b){
value = b.value;
}
int main()
{
A a;
B b;
b.Add(100);
a.Operate(b);
a.Show();
}