跳转到内容

C++ 友元函数

来自代码酷

C++友元函数是C++面向对象编程中的一个特殊特性,它允许非成员函数访问类的私有(private)和保护(protected)成员。友元函数打破了类的封装性,但在某些场景下能提供更高的灵活性。本文将详细介绍友元函数的定义、语法、应用场景及注意事项。

基本概念[编辑 | 编辑源代码]

友元函数(Friend Function)是一个非成员函数,但它被声明为类的“朋友”,从而获得访问该类私有和保护成员的权限。友元函数可以是普通函数,也可以是其他类的成员函数(称为友元成员函数)。

友元函数的特性:

  • 不属于类的成员函数,但能访问类的私有成员。
  • 不受类的访问修饰符(public/private/protected)限制。
  • 通常用于需要跨类操作私有数据的场景。

语法[编辑 | 编辑源代码]

友元函数在类内用`friend`关键字声明,但其定义在类外。

  
class ClassName {  
private:  
    int privateData;  

public:  
    // 声明友元函数  
    friend void friendFunction(ClassName& obj);  
};  

// 定义友元函数(无需作用域运算符::)  
void friendFunction(ClassName& obj) {  
    obj.privateData = 42; // 直接访问私有成员  
}

示例:友元函数操作私有数据[编辑 | 编辑源代码]

以下代码展示友元函数如何修改类的私有成员:

  
#include <iostream>  

class Box {  
private:  
    double width;  

public:  
    Box(double w) : width(w) {}  

    // 声明友元函数  
    friend void printWidth(Box& box);  
};  

// 定义友元函数  
void printWidth(Box& box) {  
    std::cout << "Box width: " << box.width << std::endl; // 直接访问私有成员  
}  

int main() {  
    Box box(10.0);  
    printWidth(box); // 输出: Box width: 10  
    return 0;  
}

友元函数的实际应用[编辑 | 编辑源代码]

场景1:运算符重载[编辑 | 编辑源代码]

友元函数常用于重载运算符,尤其是需要对称性操作的场景(如`operator+`)。

  
class Complex {  
private:  
    double real, imag;  

public:  
    Complex(double r, double i) : real(r), imag(i) {}  

    // 声明友元运算符重载  
    friend Complex operator+(const Complex& a, const Complex& b);  
};  

// 定义友元运算符  
Complex operator+(const Complex& a, const Complex& b) {  
    return Complex(a.real + b.real, a.imag + b.imag);  
}  

int main() {  
    Complex c1(1.0, 2.0), c2(3.0, 4.0);  
    Complex c3 = c1 + c2; // 调用友元运算符  
    return 0;  
}

场景2:跨类协作[编辑 | 编辑源代码]

当多个类需要共享数据时,友元函数可避免暴露私有成员。

  
class Storage; // 前向声明  

class Display {  
public:  
    void show(const Storage& storage);  
};  

class Storage {  
private:  
    int data;  

public:  
    Storage(int d) : data(d) {}  

    // 声明Display的成员函数为友元  
    friend void Display::show(const Storage& storage);  
};  

void Display::show(const Storage& storage) {  
    std::cout << "Storage data: " << storage.data << std::endl;  
}

注意事项[编辑 | 编辑源代码]

  • 慎用友元:过度使用会破坏封装性,增加代码耦合度。
  • 不可继承:友元关系不传递到派生类。
  • 作用域限制:友元函数不属于类,因此不能通过对象调用(如`obj.friendFunction()`是错误的)。

总结[编辑 | 编辑源代码]

友元函数是C++中一种强大的工具,用于在特定场景下突破封装限制。合理使用可提升代码灵活性,但需注意其潜在的设计风险。

classDiagram class Box { -double width +Box(double w) +friend printWidth(Box&) } class printWidth { +void printWidth(Box&) } Box --|> printWidth : friend

模板:C++学习路径结构导航