一、friend class的概念
C++中的friend关键字用于在类定义中声明其他类或函数为友元,这样它们就可以访问类的私有成员。而friend class则用于声明一整个类为友元。
当一个类被声明为另一个类的友元时,它可以访问该类的私有成员,但并不具备该类的成员函数或方法。而当一个类被声明为另一个类的friend class时,它可以访问该类的私有成员和成员函数或方法。
二、friend class的使用场景
friend class的使用场景多种多样,下面介绍其中两种典型的情境。
1.友元类与封装的关系:
class Box { private: int length; int width; int height; public: Box(int l = 0, int w = 0, int h = 0) { length = l; width = w; height = h; } friend class BoxVolume; // 声明BoxVolume类为Box的友元类 }; class BoxVolume { public: int getVolume(Box &box) { return box.length * box.width * box.height; } };
在上面的示例中,我们声明BoxVolume类为Box类的友元类,这样BoxVolume类就可以访问Box类的私有成员length、width和height,并利用它们计算出Box的体积。
2.友元类与继承的关系:
class Fruit { protected: // 注意这里使用protected而不是private int weight; public: Fruit(int w) : weight(w) {} void showWeight() { std::cout << "Fruit's weight is: " << weight << std::endl; } friend class Apple; // 声明Apple类为Fruit的友元类 }; class Apple : public Fruit { public: Apple(int w) : Fruit(w) {} void showWeight() { std::cout << "Apple's weight is: " << weight << std::endl; } void showFruitWeight(Fruit &fruit) { std::cout << "Fruit's weight is: " << fruit.weight << std::endl; } };
在上面的示例中,我们声明Apple类为Fruit类的友元类,这样Apple类就可以访问Fruit类的受保护成员weight,并将其作为Apple类自己的成员使用。
三、friend class的优缺点
friend class的优点在于它可以加强类与类之间的关系,提供更为灵活的访问权限控制。在某些场景下,如上面两个示例所示,friend class可以极大地简化类的实现过程,提高程序的执行效率。
然而,friend class也存在缺点。首先,它破坏了面向对象的封装性,让友元类得以在类内直接访问另一个类的私有成员和方法,导致程序难以维护和拓展。其次,使用friend关键字增加了代码复杂度,需要更多的注释和说明。
四、总结
friend class是C++面向对象编程中一个非常有用的概念,可以提高程序的执行效率和灵活性,但也需要注意封装性及代码复杂度。在使用friend class时,需要对其使用的场景和影响进行合理的权衡和把握。