📜  C++ |朋友关键字|问题2(1)

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

C++ | 朋友关键字 | 问题2

在C++中,friend是一个关键字,用于允许外部类或函数访问一个类的私有成员或保护成员。在本文中,我们将深入探讨friend关键字以及与其相关的问题2。

friend关键字的基本用法

当我们声明一个类中的函数或类作为另一个类的friend时,它会被视为另一个类的友元函数或友元类。友元函数或友元类可以访问其他类的私有成员或保护成员,这使得类的设计变得更加灵活。

声明一个函数为友元函数

下面是一个例子,它演示了如何将一个函数声明为一个类的友元函数:

#include <iostream>

class MyClass {
private:
  int x;

public:
  MyClass(int x) : x(x) {}
  friend void printX(MyClass obj);
};

void printX(MyClass obj) {
  std::cout << "x is " << obj.x << std::endl;
}

int main() {
  MyClass obj1(10);
  printX(obj1);
  return 0;
}

在上面的例子中,printX函数被声明为MyClass类的友元函数,它可以直接访问MyClass类的私有成员x。在main函数中,我们创建一个MyClass对象,并将其传递给printX函数。

声明一个类为友元类

下面是一个例子,它演示了如何将一个类声明为另一个类的友元类:

#include <iostream>

class MyClass {
private:
  int x;

public:
  MyClass(int x) : x(x) {}
  friend class MyClassFriend;
};

class MyClassFriend {
public:
  void printX(MyClass obj) {
    std::cout << "x is " << obj.x << std::endl;
  }
};

int main() {
  MyClass obj1(10);
  MyClassFriend obj2;
  obj2.printX(obj1);
  return 0;
}

在上面的例子中,MyClassFriend类被声明为MyClass类的友元类。MyClassFriend类的成员函数printX可以直接访问MyClass类的私有成员x。在main函数中,我们创建一个MyClass对象和一个MyClassFriend对象,并将MyClass对象传递给MyClassFriend对象的printX函数。

问题2:为什么友元函数或友元类可以访问私有成员?

友元函数或友元类可以访问私有成员的原因是,它们被视为该类的扩展,可以访问类的私有成员和保护成员。这允许我们在一定程度上突破类的封装,使类的设计变得更加灵活。然而,需要注意的是,在使用友元函数或友元类时,应该尽量避免滥用它们,遵循最小化访问原则,以保证类的封装性。

总结

本文介绍了friend关键字的基本用法。我们演示了如何声明一个函数为友元函数,以及如何声明一个类为友元类。我们还解释了为什么友元函数或友元类可以访问私有成员。请记住,在设计类时,友元函数或友元类应该谨慎使用,以确保类的封装性。