Skip to content
On this page

CPP_友元


标签:CPP/面向对象  

友元

  • 向别人开权限,将别人设置成朋友,允许别人访问自己所有权下的成员

友元函数

全局函数作为友元函数

  • 允许该函数访问自己所有权限下的成员,包括私有成员
  • 格式 friend fun()
  • 友元函数并非是类成员函数,没有 this 指针
cpp
class MyClass {
public:
  MyClass(int value) : m_value(value) {}
  friend void PrintValue(const MyClass& obj); //友元函数的声明
private:
  int m_value;
};
// 友元函数的定义
void PrintValue(const MyClass& obj) {
  std::cout << "The value of the object is: " << obj.m_value << std::endl;
}
int main() {
  MyClass obj(42);
  PrintValue(obj); // 直接调用友元函数
  return 0;
}

类的成员函数作为友元函数

  • 要求该函数类内声明,类外定义
cpp
class B;

class A {
  int val;
public:
  A(int v) : val(v) {}
  // 把类的方法作为友元函数                 
  friend void B::Print(const A& obj);    
  // 把整个类当作友元类                     
  friend class B;                        
};

class B {
public:
  void Print(const A& obj) {                             
    cout << "The value of A is: " << obj.val << endl;    
  }                                                      
};

int main() {
  A a(42);
  B b;
  b.Print(a);
  return 0;
}

友元类

  • 声明一个类作为自己的友元类,允许类中所有的成员函数访问自己的成员

注意事项

  • 单向性,A 能访问 B,但 B 不能访问 A
  • 不具传递性,A 能访问 B,B 能访问 C,但 A 不能直接访问 C
  • 不具继承性,父类的友元不一定是子类的友元
  • 尽少使用友元,破坏了类的封装性
  • 必须使用友元的情况:插入和提取运算符重载的时候

Last updated: