0

0

c++中什么是友元函数和友元类_c++友元机制的作用与使用场景

尼克

尼克

发布时间:2025-10-19 17:14:01

|

1040人浏览过

|

来源于php中文网

原创

友元函数是定义在类外但能访问类私有和保护成员的普通函数。它通过在类内用friend关键字声明,实现对类成员的直接访问,如displaySecret函数访问MyClass的私有成员secret。

c++中什么是友元函数和友元类_c++友元机制的作用与使用场景

在C++中,友元函数友元类是访问控制机制的例外。它们允许某些非成员函数或外部类访问某个类的私有(private)和保护(protected)成员,从而打破封装的限制。这种机制称为“友元机制”。

什么是友元函数

友元函数是定义在类外部的普通函数,但它被声明为某个类的“朋友”,因此可以访问该类的所有成员,包括私有和保护成员。

友元函数不是类的成员函数,也不属于该类的作用域,但它需要在类内部使用friend关键字进行声明。

示例:
class MyClass {
private:
    int secret;
public:
    MyClass(int s) : secret(s) {}
    
    // 声明友元函数
    friend void displaySecret(const MyClass& obj);
};

// 友元函数定义
void displaySecret(const MyClass& obj) {
    std::cout << "Secret value: " << obj.secret << std::endl;  // 可以访问私有成员
}

在这个例子中,displaySecret不是MyClass的成员函数,但通过friend关键字,它可以访问secret这个私有变量。

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

什么是友元类

友元类是指一个类被声明为另一个类的友元,从而可以访问后者的所有私有和保护成员。

当两个类之间存在紧密协作关系时,这种设计可能有用。

示例:
class Helper;

class Data {
private:
    int value;
public:
    Data(int v) : value(v) {}
    
    // 声明Helper为友元类
    friend class Helper;
};

class Helper {
public:
    void printData(const Data& d) {
        std::cout << "Value: " << d.value << std::endl;  // 可以访问私有成员
    }
};

这里Helper类可以自由访问Data类的私有成员value,因为它是被明确授予“友元”权限的。

友元机制的作用

友元机制的主要作用是:在保持封装性的同时,为特定函数或类提供必要的访问权限。

  • 突破private/protected的访问限制,用于实现需要深度协作的功能
  • 支持运算符重载,尤其是对称操作符(如+、
  • 简化类之间的数据交互,避免不必要的getter函数
  • 提高性能,减少接口调用开销

常见的使用场景

虽然友元破坏了严格的封装原则,但在一些合理场景下非常实用。

NatAgent
NatAgent

AI数据情报监测与分析平台

下载

1. 重载输入输出运算符

标准库中的>>运算符通常需要访问对象内部数据。

class Person {
    std::string name;
    int age;
public:
    Person(std::string n, int a) : name(n), age(a) {}
    
    friend std::ostream& operator<<(std::ostream& os, const Person& p);
};

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

2. 数学类与辅助计算类配合

比如矩阵类和向量类之间需要互相访问数据进行运算,可将计算密集型类设为友元。

3. 工厂模式或管理类访问私有构造函数

某些设计中,只允许特定管理类创建对象,可通过友元实现受控实例化。

4. 单元测试中访问私有成员

测试类可以被声明为被测类的友元,以便直接验证内部状态,这在调试和测试阶段很有帮助。

基本上就这些。友元机制是一个双刃剑——它提供了灵活性,但也可能破坏封装性。应谨慎使用,仅在确实需要且无法通过公有接口合理实现时才考虑引入友元。设计时优先使用公共接口,只有在性能或逻辑耦合要求极高时才动用友元。不复杂但容易忽略的是:友元关系不具有传递性,也不能被继承。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1502

2023.10.24

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

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

232

2024.02.23

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

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

87

2025.10.17

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

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

194

2024.02.23

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

2

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.9万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.6万人学习

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

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