乐闻世界logo
搜索文章和话题

Friend declaration in C++ - difference between public and private

4 个月前提问
3 个月前修改
浏览次数27

1个答案

1

在C++中,友元声明是一种允许某些外部函数或类访问当前类中的私有(private)和受保护(protected)成员的机制。友元可以被声明在类的公共(public)区域或私有(private)区域中,但无论声明在哪里,它们的效果都是相同的。也就是说,友元的访问级别不受它们被声明在公共区域或私有区域的影响。友元的关键作用是突破封装性,允许特定的外部函数或类直接访问类的内部成员。

公共 vs 私有友元

尽管友元的访问性不受其声明位置(公共或私有区域)的影响,但声明友元的位置通常反映了设计者的意图和代码的可读性。

  • 公共区域声明友元: 将友元函数声明在公共区域,通常意味着这些友元关系对于理解类的外部接口是重要的。例如,如果一个类表示一个复杂数,它可能会将一些全局函数(如加法和乘法运算符)声明为其友元,以允许这些函数直接访问私有成员变量。

    cpp
    class Complex { public: friend Complex operator+(const Complex& c1, const Complex& c2); friend Complex operator*(const Complex& c1, const Complex& c2); private: double real, imag; };
  • 私有区域声明友元: 虽然这种做法较少见,但有时将友元声明在私有区域可以增加代码的封装性和安全性。这表明这些友元关系是类实现的私有细节,普通用户不需要关心这些细节。这样做可以减少类公共接口的复杂性。

    cpp
    class Widget { public: // ... 公共接口 ... private: friend class WidgetHelper; // 只有WidgetHelper可以访问Widget的私有部分 int data; };

示例:使用友元

以下是一个使用友元函数的例子,演示了如何允许外部函数访问类的私有数据。

cpp
#include <iostream> class Box { private: double width; public: Box(): width(0) {} friend void printWidth(const Box& b); }; void printWidth(const Box& b) { std::cout << "Width of box: " << b.width << std::endl; } int main() { Box box; printWidth(box); // 正确,因为printWidth是Box的一个友元 return 0; }

在这个例子中,即使printWidth函数尝试访问Box类的私有成员width,它也是允许的,因为printWidth被声明为Box的友元。这显示了友元功能强大的封装突破能力。

2024年6月29日 12:07 回复

你的答案