0

0

c++中的友元函数是什么_c++友元函数使用解析

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-06 16:30:02

|

807人浏览过

|

来源于php中文网

原创

友元函数是C++中允许非成员函数访问类私有和保护成员的机制。它在类内用friend关键字声明,定义在类外,可直接访问类的所有成员,但不具有传递性和继承性,常用于运算符重载等场景。

c++中的友元函数是什么_c++友元函数使用解析

友元函数是C++中一种特殊的机制,它允许一个非成员函数访问类的私有(private)和保护(protected)成员。正常情况下,类的私有成员只能被该类的成员函数访问,而外部函数或其它类无法直接读取或修改它们。但通过将某个函数声明为类的“友元”,就可以打破这一限制。

什么是友元函数?

友元函数不是类的成员函数,但它被授予了访问类中所有成员(包括 private 和 protected 成员)的权限。在类内部使用关键字 friend 来声明一个友元函数。

关键点:

  • 友元函数定义在类外部,但它可以访问类的所有成员。
  • 它不需要通过对象调用,但在实现时通常需要传入类的对象作为参数。
  • 友元关系是单向的,不具有传递性,也不能被继承。

如何声明和使用友元函数?

在类内用 friend 关键字声明一个函数,然后在类外定义这个函数。下面是一个简单示例:

立即学习C++免费学习笔记(深入)”;

#include 
using namespace std;

class Box {
private:
double width;
public:
Box(double w) : width(w) {}
// 声明友元函数
friend void printWidth(Box box);
};

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

int main() {
Box b(10.5);
printWidth(b); // 输出:Width of box: 10.5
return 0;
}

在这个例子中,printWidth() 不是 Box 类的成员函数,但由于被声明为友元,它可以访问 width 这个私有成员。

Whimsical
Whimsical

Whimsical推出的AI思维导图工具

下载

友元函数的常见用途

友元函数在实际开发中有几个典型应用场景:

  • 运算符重载:比如重载
  • 两个类之间的数据共享:当一个函数需要同时访问两个不同类的私有成员时,可将其设为这两个类的友元。
  • 提高性能:避免频繁调用 getter 函数获取私有数据。

例如,重载输出操作符:

class Student {
private:
string name;
int age;
public:
Student(string n, int a) : name(n), age(a) {}
friend ostream& operator<<(ostream& os, const Student& s);
};

ostream& operator<<(ostream& os, const Student& s) {
os << "Name: " << s.name << ", Age: " << s.age;
return os;
}

注意事项与潜在问题

虽然友元函数提供了便利,但也应谨慎使用:

  • 破坏封装性:过度使用友元会削弱类的数据隐藏特性,增加耦合度。
  • 维护难度上升:一旦友元函数过多,类的私有成员可能在多个地方被修改,不利于调试和维护。
  • 友元不能被继承:基类的友元函数不能访问派生类的私有成员。
  • 友元关系是单向的:A 是 B 的友元,并不代表 B 也是 A 的友元。

基本上就这些。友元函数是一个有力的工具,在需要跨类访问或简化接口设计时非常有用,但要避免滥用,保持良好的面向对象设计原则。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

191

2024.02.23

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号