📜  c++中的友元函数(1)

📅  最后修改于: 2023-12-03 14:59:51.190000             🧑  作者: Mango

C++中的友元函数

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;
}

在上述代码中,通过在类中声明友元函数,使得该函数可以访问到复数对象的私有成员realimag,方便了复数对象的加法运算。

访问其他类的私有成员

在实际开发中,有时需要访问其他类的私有成员,以便于实现某些功能。此时,可以将需要访问的类成员声明为友元函数。例如,定义一个矩形类对象,需要计算其面积,但是该类没有提供计算面积的函数,可以通过将一个全局函数声明为该类的友元函数,来方便计算矩形面积:

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函数是该类的友元函数,可以访问矩形对象的私有成员widthheight,方便了计算矩形面积的功能。

总结

友元函数是一种特殊的函数,其可以访问其他类的私有成员,方便了某些功能的实现。需要注意的是,友元函数不属于类的成员函数,需要在类定义外部进行实现,且无法使用限定符类名::进行定义。在实际开发中,友元函数的使用需要谨慎,尽可能保证封装性的原则。