9.C++友元函数

C++友元函数

友元函数(Friend Function)是C++中一种特殊的函数,它能够访问类的私有(private)和保护(protected)成员,即使它不是该类的成员函数。

基本概念

友元函数的特点:

  • 不是类的成员函数,但可以访问类的所有成员
  • 需要在类内部用friend关键字声明
  • 定义在类外部,不需要使用类名和作用域解析运算符(:😃

声明方式

class MyClass {
private:
    int privateData;
    
public:
    // 声明友元函数
    friend void friendFunction(MyClass &obj);
};

// 定义友元函数
void friendFunction(MyClass &obj) {
    obj.privateData = 10;  // 可以直接访问私有成员
}

使用场景

1. 访问多个类的私有成员

class Box;  // 前向声明

class Widget {
private:
    int size;
    friend void compare(Widget &w, Box &b);  // 友元函数
};

class Box {
private:
    int volume;
    friend void compare(Widget &w, Box &b);  // 同一个友元函数
};

// 可以访问两个类的私有成员
void compare(Widget &w, Box &b) {
    if (w.size > b.volume) {
        cout << "Widget is larger";
    }
}

2. 运算符重载

友元函数常用于运算符重载,特别是需要对称性的运算符:

class Complex {
private:
    double real, imag;
    
public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}
    
    // 声明友元运算符函数
    friend Complex operator+(const Complex &c1, const Complex &c2);
};

// 定义运算符重载
Complex operator+(const Complex &c1, const Complex &c2) {
    return Complex(c1.real + c2.real, c1.imag + c2.imag);
}

3. 提高性能

当函数需要频繁访问类的私有数据时,使用友元可以避免通过公有接口的额外开销。

注意事项

  1. 封装性破坏:友元函数破坏了类的封装性,应谨慎使用
  2. 单向关系:友元关系是单向的,A是B的友元不意味着B是A的友元
  3. 不可继承:友元关系不能被继承
  4. 不受访问控制:友元声明可以放在类的任何部分(private/public/protected)

友元类

除了友元函数,C++还支持友元类:

class A {
    friend class B;  // B是A的友元类
    
private:
    int secret;
};

class B {
public:
    void accessA(A &a) {
        a.secret = 42;  // B可以访问A的私有成员
    }
};

最佳实践

  1. 只在必要时使用友元
  2. 优先考虑使用成员函数
  3. 对于需要对称性的运算符重载(如+、-、==等),友元函数是更好的选择
  4. 文档化友元关系,说明为什么需要这种特殊访问权限

友元函数是C++提供的一种灵活机制,合理使用可以在保持良好封装性的同时提供必要的灵活性。

posted @ 2025-06-27 20:05  站着说话不腰疼  阅读(96)  评论(0)    收藏  举报