📅  最后修改于: 2023-12-03 14:59:51.190000             🧑  作者: Mango
C++中的友元函数是指在类中可以访问其他类的私有成员的函数,需要在类的定义中声明,并在类外进行实现。友元函数虽然打破了封装性,但是在某些实际情况下会方便很多,如重载运算符等。
友元函数的声明和类成员函数的声明格式类似,只需要在函数前加上关键字friend
即可:
class A{
private:
int a;
public:
friend void func(A obj); // 声明友元函数
};
需要注意的是,友元函数不属于该类的成员函数,因此无法使用A::
这种限定符进行声明。另外,友元函数在类外部实现,需要使用限定符类名::
进行定义:
void A::func(A obj){
// 函数体
}
C++中的很多运算符都可以被重载,例如加号,减号等。但是,当重载运算符作用于自定义的类对象时,需要保证运算符的操作数属于同一类。如果需要对不同类的对象进行运算,则需要使用友元函数。例如,定义一个复数类对象,需要对其进行加法运算,可以使用以下代码:
class Complex{
private:
double real;
double imag;
public:
Complex(double r, double i) : real(r), imag(i) {}
friend Complex operator+(Complex a, Complex b);
};
Complex operator+(Complex a, Complex b){
Complex res(a.real+b.real, a.imag+b.imag);
return res;
}
在上述代码中,通过在类中声明友元函数,使得该函数可以访问到复数对象的私有成员real
和imag
,方便了复数对象的加法运算。
在实际开发中,有时需要访问其他类的私有成员,以便于实现某些功能。此时,可以将需要访问的类成员声明为友元函数。例如,定义一个矩形类对象,需要计算其面积,但是该类没有提供计算面积的函数,可以通过将一个全局函数声明为该类的友元函数,来方便计算矩形面积:
class Rectangle{
private:
int width;
int height;
public:
Rectangle(int w, int h) : width(w), height(h) {}
friend int area(Rectangle rect); // 声明友元函数
};
int area(Rectangle rect){
return rect.width * rect.height;
}
在上述代码中,area
函数是该类的友元函数,可以访问矩形对象的私有成员width
和height
,方便了计算矩形面积的功能。
友元函数是一种特殊的函数,其可以访问其他类的私有成员,方便了某些功能的实现。需要注意的是,友元函数不属于类的成员函数,需要在类定义外部进行实现,且无法使用限定符类名::
进行定义。在实际开发中,友元函数的使用需要谨慎,尽可能保证封装性的原则。