0

0

C++ friend友元函数详解_C++类访问权限控制与友元类用法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-06 18:27:33

|

445人浏览过

|

来源于php中文网

原创

友元机制允许非成员函数或类访问私有和受保护成员,通过friend关键字在类内声明,可用于重载运算符或紧密协作的类间访问,但不具传递性和继承性,应谨慎使用以维护封装性。

c++ friend友元函数详解_c++类访问权限控制与友元类用法

在C++中,类的封装性面向对象编程的重要特性之一。通过访问控制符(publicprotectedprivate),我们可以限制对类成员的访问,从而保护数据安全。但有时候,我们需要让某些非成员函数或另一个类访问当前类的私有或受保护成员,这时就需要用到友元(friend)机制。

友元函数的作用与定义

友元函数是一种特殊的函数,它虽然不是类的成员函数,但可以访问该类的私有和受保护成员。友元函数必须在类内部进行声明,并使用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;  // 可以访问 private 成员
}

在这个例子中,displaySecret 不是 MyClass 的成员函数,但它能直接访问其私有成员 secret。注意:友元函数不受访问控制符的影响,可以在类中的任何位置声明,一般习惯放在 public 或 private 区域均可。

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

友元类的使用方法

除了友元函数,C++还支持友元类,即一个类可以成为另一个类的友元,从而访问其所有私有和受保护成员。

语法格式如下:

class FriendClass;  // 提前声明

class MyClass {
private:
    int data;
public:
    MyClass(int d) : data(d) {}

    // 声明 FriendClass 为友元类
    friend class FriendClass;
};

class FriendClass {
public:
    void accessData(const MyClass& obj) {
        std::cout << "Accessing private data: " << obj.data << std::endl;
    }
};

此时,FriendClass 中的所有成员函数都可以访问 MyClass 的私有成员。这在一些紧密协作的类之间非常有用,比如容器类和迭代器类。

GentleAI
GentleAI

GentleAI是一个高效的AI工作平台,为普通人提供智能计算、简单易用的界面和专业技术支持。让人工智能服务每一个人。

下载

需要注意的是,友元关系不具备传递性。如果 A 是 B 的友元,B 是 C 的友元,A 并不能访问 C 的私有成员。同时,友元关系也不具备继承性——基类的友元不会自动成为派生类的友元。

访问权限控制与设计考量

C++的访问控制分为三种:

  • private:仅类自身和友元可以访问
  • protected:类自身、派生类和友元可以访问
  • public:任何地方都可以访问

友元打破了封装性,因此应谨慎使用。过度使用友元会导致类之间的耦合度升高,降低代码的可维护性和安全性。

建议只在以下场景使用友元:

  • 重载运算符,如 operator(输出流操作符)需要访问对象内部数据
  • 两个类高度协作,逻辑上属于同一模块
  • 工具函数需要高效访问内部状态,且不希望将其作为成员暴露

例如,输入输出流常与友元结合使用:

class Person {
private:
    std::string name;
    int age;
public:
    Person(std::string n, int a) : name(n), age(a) {}

    // 允许 operator<< 访问私有成员
    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;
}

基本上就这些。友元机制提供了必要的灵活性,但也要求程序员有更强的责任心去维护封装原则。合理使用,才能发挥其优势而不破坏设计结构。

相关专题

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

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

1458

2023.10.24

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

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

227

2024.02.23

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

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

85

2025.10.17

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.09.05

java面向对象
java面向对象

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

49

2025.11.27

什么是低代码
什么是低代码

低代码是一种软件开发方法,使用预构建的组件可快速构建应用程序,无需大量编程。想了解更多低代码的相关内容,可以阅读本专题下面的文章。

282

2024.05.21

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

c++ Libcurl用法详解
c++ Libcurl用法详解

本专题整合了c++ Libcurl用法详解,阅读专题下面的文章了解更多详细内容。

0

2026.01.07

c++ Libcurl用法大全
c++ Libcurl用法大全

本专题整合了c++ Libcurl用法详解,阅读专题下面的文章了解更多详细内容。

0

2026.01.07

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.4万人学习

php初学者入门课程
php初学者入门课程

共10课时 | 0.6万人学习

PHP会话控制/文件上传/分页技术
PHP会话控制/文件上传/分页技术

共22课时 | 2万人学习

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

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