友元是一种允许某些外部函数或类访问另一个类的成员的机制

简介: 友元是C++中的一个强大特性,它提供了一种机制来允许特定的外部函数或类访问私有和保护成员。正确使用友元可以增强程序的功能性和灵活性,但应谨慎使用以避免破坏封装性和增加代码的复杂度。在设计类和功能时,合理利用友元,可以使得C++程序更加有效和高效。

在C++编程语言中,"友元"(Friend)是一种允许某些外部函数或类访问另一个类的私有(private)和保护(protected)成员的机制。友元功能在C++中是非常有用的,尤其是在实现某些特定的功能时,比如操作符重载或者某些需要深入访问类内部的工具函数。

1. 友元函数

友元函数不是类的成员函数,但它可以访问类的所有私有(private)和保护(protected)成员。你可以在类中声明某个函数为友元,这样就允许这个函数访问类的非公开成员。

示例代码:

class Box {
   
private:
    double width;
public:
    double length;
    void setWidth(double wid) {
   
        width = wid;
    }
    friend void printWidth(Box box);
};

void printWidth(Box box) {
   
    /* 因为printWidth是Box的友元,它可以直接访问私有成员 */
    std::cout << "Width of box : " << box.width << std::endl;
}

在这个示例中,printWidth函数是Box类的一个友元,所以它可以访问Box类的私有成员width

2. 友元类

当一个类被声明为另一个类的友元时,这个类的所有成员函数都可以访问另一个类的私有和保护成员。

示例代码:

class Box {
   
private:
    double width;
public:
    double length;
    friend class Printer;
};

class Printer {
   
public:
    void printWidth(Box& b) {
   
        std::cout << "Width of box: " << b.width << std::endl;
    }
};

在这个示例中,Printer类是Box类的友元,因此Printer中的成员函数printWidth可以访问Box的私有成员width

3. 友元的使用原则和考虑

友元机制虽然强大,但使用时应谨慎,因为它破坏了类的封装和隐藏信息的原则。合理使用友元可以使得代码更加灵活和强大,但过多地使用友元会使得代码的维护变得困难,因为它创建了一个外部类或函数与类的非公开信息之间的依赖。

在设计类的接口时,应优先考虑使用公有成员函数来提供必要的服务,只在无法避免的情况下使用友元,例如操作符重载或某些特定的函数需要深入访问类的私有部分。

结论

友元是C++中的一个强大特性,它提供了一种机制来允许特定的外部函数或类访问私有和保护成员。正确使用友元可以增强程序的功能性和灵活性,但应谨慎使用以避免破坏封装性和增加代码的复杂度。在设计类和功能时,合理利用友元,可以使得C++程序更加有效和高效。

相关文章
|
1月前
|
C++
C++程序中的派生类成员访问属性
C++程序中的派生类成员访问属性
26 1
|
19天前
|
Java C++ Python
私有成员、公共成员、保护成员如何定义
私有成员、公共成员、保护成员如何定义
11 0
|
1月前
|
JavaScript
如何在自调用函数内部将变量和函数暴露出来,以便外部访问?
在自调用函数中,通过绑定变量和函数到全局对象(浏览器环境的`window`或Node.js的`global`)可实现外部访问。
|
1月前
|
C++
[C++] 多个模块实时公用一个类中的成员变量
[C++] 多个模块实时公用一个类中的成员变量
98 1
|
6月前
定义和声明的区别 以及 内部和外部函数
把建立存储空间的变量声明称定义; 不需要建立存储空间的声明称为声明; c为例, 在函数中出现的对变量的声明(除了用extern声明的以外)都是定义 在函数中对其他函数的声明不是函数的定义 详细见c程序设计-谭浩强 196-197页
39 0
|
7月前
|
存储 Java
Java内部类 - 局部/匿名/成员/静态内部类
Java内部类 - 局部/匿名/成员/静态内部类
69 0
|
9月前
类的内部成员之五:内部类
类的内部成员之五:内部类
20 1
|
9月前
直接和间接访问
直接和间接访问
|
11月前
|
C++
C++ 数据的共享 静态数据成员和静态函数成员
C++ 数据的共享 静态数据成员和静态函数成员
67 0
|
Java Scala vr&ar
内部类访问外部类属性案例|学习笔记
快速学习内部类访问外部类属性案例。
100 0