这是需要友元函数

因为显示器类存储的朋友,任何显示的成员使用的存储类对象可以直接访问存储的私有成员。这是一个简单的程序,显示使用上面的
1
2
3
4
5
6
7
8
9
int main()
{
    Storage cStorage(5, 6.7);
    Display cDisplay(false);
 
    cDisplay.DisplayItem(cStorage);
 
    return 0;

这个程序产生以下结果:

6.7 5

一个朋友类一些额外的注释。首先,尽管显示存储的一个朋友,显示并没有直接接触到这个指针存储对象。第二,因为显示存储的朋友,这并不意味着存储也显示一个朋友。如果你想要两类是彼此的朋友,都必须申报的其他朋友一样。最后,如果类A是B的一个朋友,和B是C的一个朋友,这并不意味着是一个朋友

当使用友元函数和类的小心,因为它允许朋友函数或类违反封装。如果类变化的细节,细节的朋友也将被迫改变。因此,限制你的朋友使用函数和类的最小。

做一个函数的一些类朋友意味着函数可以访问类的私有成员变量(尽管这个功能不是类的成员)。以上的湿度/天气的例子显示了一个例子:printweather()运用湿度和天气的私有成员(它通常无法访问,因为他们是私有的)。然而它是允许这样做的因为它已经交了一个朋友

它是强制性的声明一个函数(这是需要友元函数)在类本身?

假设有一个类命名的乐趣。它有一些私人和公共元素。现在我想要一个函数调用一些有乐趣的朋友。因此,它是要宣布一些有趣的私人或公共部门?或者可以声明和定义它完全外部类前缀的朋友。


### C++ 中友元函数的概念和用法 #### 1. **友元函数的基本概念** 友元函数是一种特殊类型的函数,虽然它不是类的成员函数,但却可以访问该类的私有(`private`)和保护(`protected`)成员。为了使一个函数成为某类的友元,需在类定义中将其声明为 `friend`[^1]。 友元函数的主要目的是打破封装性的限制,允许某些特定函数访问类的内部实现细节,这在需要跨类协作或自定义输入/输出操作时非常有用[^3]。 --- #### 2. **友元函数的定义与声明** 友元函数可以在类外定义,但在类内声明时必须加上关键字 `friend`。其语法如下: ```cpp class ClassName { friend 返回类型 函数名(参数列表); }; ``` 需要注意的是,友元函数的定义与普通函数无异,只是它的声明位于类体内,并带有 `friend` 关键字[^4]。 --- #### 3. **友元函数的应用场景** 友元函数常用于以下几种情况: - **重载运算符**:例如重载流插入运算符 (`<<`) 和提取运算符 (`>>`)。 - **实现类间协作**:当两个类之间存在紧密联系时,可以通过友元函数共享彼此的私有数据。 - **简化复杂逻辑**:对于某些需要频繁访问私有成员的操作,使用友元函数可能更加直观和高效。 --- #### 4. **友元函数的示例代码** 以下是一个完整的示例,展示了如何使用友元函数访问类的私有成员: ```cpp #include <iostream> using namespace std; // 定义类 class MyClass { private: int data; // 私有成员 public: // 构造函数初始化私有成员 MyClass(int value) : data(value) {} // 声明友元函数 friend void displayData(const MyClass& obj); }; // 定义友元函数 void displayData(const MyClass& obj) { cout << "Private Data: " << obj.data << endl; // 访问私有成员 } int main() { MyClass obj(42); // 创建对象并初始化 displayData(obj); // 调用友元函数访问私有成员 return 0; } ``` 运行结果: ``` Private Data: 42 ``` 在此示例中,`displayData` 是一个友元函数,尽管它并非 `MyClass` 的成员函数,却能成功访问 `data` 这一私有成员[^2]。 --- #### 5. **注意事项** - 友元函数破坏了类的封装性,因此应谨慎使用,仅在必要时才引入。 - 友元函数既不属于任何类的作用域,也不受继承规则的影响。 - 即便拥有访问权限,友元函数仍需遵循正常的访问语法规则,即通过对象来引用成员变量或方法。 --- ### 总结 友元函数作为一种特殊的工具,在 C++ 中提供了灵活的方式以突破封装限制,满足特定需求下的功能扩展。然而,过度依赖友元可能会降低代码的可维护性和安全性,应在权衡利弊后再决定是否采用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值