友元函数是用friend关键字声明的非成员函数,可访问类的私有和保护成员。它在类内声明但不属于该类,调用方式与普通函数相同。例如,showBalance函数通过声明为BankAccount类的友元,能直接访问其私有成员balance。友元函数常用于运算符重载、类间数据共享等场景,但不可继承且会削弱封装性,应谨慎使用以确保安全性与可维护性。

在C++中,类的私有成员(private)默认只能被该类的成员函数访问,这是封装的基本体现。但有时我们需要让某个非成员函数或另一个类访问这些私有数据,这时就可以使用友元函数(friend function)。它能突破类的封装限制,直接访问类的私有和保护成员,而不需要通过公有接口。
什么是友元函数
友元函数是用关键字 friend 声明的非成员函数,它可以访问类的私有(private)和保护(protected)成员。虽然它在类中声明,但它不是成员函数,不隶属于对象,调用方式和普通函数一样。
基本语法如下:
class MyClass {
private:
int data;
public:
MyClass(int d) : data(d) {}
// 声明友元函数
friend void displayData(const MyClass& obj);
};
// 定义友元函数
void displayData(const MyClass& obj) {
std::cout }
如何使用友元函数访问私有成员
以下是一个完整示例,展示如何通过友元函数访问类的私有变量:
立即学习“C++免费学习笔记(深入)”;
#include iostream>
using namespace std;
class BankAccount {
private:
double balance;
public:
BankAccount(double b) : balance(b) {}
// 声明友元函数
friend void showBalance(const BankAccount& acc);
};
// 友元函数定义
void showBalance(const BankAccount& acc) {
cout }
int main() {
BankAccount account(1000.50);
showBalance(account); // 输出:账户余额: 1000.5
return 0;
}
在这个例子中,showBalance 不是 BankAccount 的成员函数,但由于被声明为 friend,它可以像成员函数一样访问 balance。
友元函数的注意事项
尽管友元函数提供了便利,但也应谨慎使用,避免破坏封装性。以下是关键点:
友元函数不受访问控制符(private/protected/public)影响,只要在类内声明即可友元关系不能被继承,子类不会自动成为友元友元函数必须在类内部显式声明,但可以在类外定义一个函数可以是多个类的友元过度使用友元会削弱类的封装性,应仅在必要时使用,如运算符重载、IO流操作等
常见应用场景
友元函数常用于以下情况:
重载运算符:比如重载 两个类之间的数据共享:一个类的友元函数可以是另一个类的成员函数工具函数需要直接访问内部状态:如调试、序列化等
例如,重载输出运算符:
class Person {
private:
std::string name;
public:
Person(const std::string& n) : name(n) {}
friend std::ostream& operator};
std::ostream& operator os return os;
}
基本上就这些。友元函数是一个有力的工具,允许特定函数绕过访问限制,但要合理使用,保持代码的可维护性和安全性。
以上就是C++如何使用友元函数_C++ friend function突破类的封装访问私有成员的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485291.html
微信扫一扫
支付宝扫一扫