709 字
4 分钟
C++中的友元(Friend)概念、用法及使用场景
2025-03-12

概念#

在C++中,友元是一种允许非成员函数或另一个类访问类的私有(private)和受保护(protected)成员的机制。友元可以打破类的封装性,使得特定的函数或类能够访问到类的内部实现细节。

用法#

  1. 友元函数
    • 定义:友元函数可以是普通的非成员函数,也可以是其他类的成员函数。
    • 声明:在类的内部使用friend关键字来声明友元函数。
    • 访问:友元函数可以访问类的所有成员,包括私有和受保护成员。
  2. 友元类
    • 定义:一个类可以声明另一个类为它的友元,这样友元类的所有成员函数都可以访问第一个类的私有和受保护成员。
    • 声明:在类的内部使用friend关键字来声明友元类。 示例代码
#include <iostream>
class Box {
private:
    double width;
public:
    Box() : width(0) {}
    // 声明友元函数
    friend void setWidth(Box& b, double w);
    // 声明友元类
    friend class BoxFriend;
};
// 定义友元函数
void setWidth(Box& b, double w) {
    b.width = w;
}
class BoxFriend {
public:
    void displayWidth(const Box& b) {
        std::cout << "Width of box: " << b.width << std::endl;
    }
};
int main() {
    Box box;
    setWidth(box, 10.0); // 使用友元函数设置宽度
    BoxFriend bf;
    bf.displayWidth(box); // 使用友元类显示宽度
    return 0;
}

使用场景#

  1. 操作符重载:在实现操作符重载时,常常需要访问类的私有成员,此时可以将重载函数声明为友元函数。
  2. 辅助函数:某些辅助函数需要直接访问类的内部状态,而不需要成为类的成员,此时可以使用友元函数。
  3. 类间协作:当两个类需要紧密协作,且其中一个类需要频繁访问另一个类的内部成员时,可以将其中一个类声明为另一个类的友元。
  4. 测试:在单元测试中,有时需要访问类的私有成员以进行更彻底的测试,此时可以使用友元。

注意事项#

  • 友元关系不是对称的,如果类A是类B的友元,并不意味着类B是类A的友元。
  • 友元关系不能传递,如果类A是类B的友元,类B是类C的友元,并不意味着类A是类C的友元。
  • 使用友元会破坏类的封装性,因此应谨慎使用,只有在确实需要时才使用。

总结:#

友元是C++中一种强大的机制,允许特定的函数或类访问类的私有和受保护成员。尽管它提供了灵活性,但也会破坏封装性,因此应谨慎使用。在操作符重载、辅助函数、类间协作和测试等场景中,友元可以发挥重要作用。

C++中的友元(Friend)概念、用法及使用场景
http://zaoweiceng.github.io/posts/cpp/友元/
作者
静惜
发布于
2025-03-12
许可协议
CC BY-NC-SA 4.0