0

0

C++中的friend关键字有什么用途?怎么用?

冰火之心

冰火之心

发布时间:2025-06-08 17:30:02

|

613人浏览过

|

来源于php中文网

原创

friend关键字允许外部函数或类访问当前类的私有和受保护成员,用于特定场景下的灵活设计。1. 可将外部函数声明为友元,使其能访问类的私有成员,如用于重载运算符或打印信息;2. 可将整个类声明为友元类,使该类的所有成员函数都能访问当前类的私有成员,适用于管理类需访问多个类内部状态的情况;3. 常用于通过友元函数重载运算符,例如输出流操作符,以实现对象的直接输出。需注意:友元关系不可逆、不继承,且应谨慎使用以避免破坏封装性

C++中的friend关键字有什么用途?怎么用?

在C++中,friend关键字的作用是打破类的封装性,让某些外部函数或类可以访问该类的私有(private)和受保护(protected)成员。这并不是鼓励滥用,而是在特定场景下非常有用。


1. 让外部函数成为“朋友”

有时候我们需要一个不属于类本身的函数来访问类的私有成员,比如重载运算符或者打印类内部信息时。这时就可以使用friend

用法示例:

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

class MyClass {
private:
    int value;
public:
    MyClass(int v) : value(v) {}
    friend void printValue(const MyClass& obj); // 声明友元函数
};

void printValue(const MyClass& obj) {
    std::cout << "Value: " << obj.value << std::endl; // 可以访问私有成员
}

这个函数不是类的成员函数,但它可以访问类的所有私有内容。

注意:友元函数不能通过对象调用,它就是一个普通的函数,只是被授予了“特权”。

2. 让另一个类成为“朋友类”

如果你希望一个类能够完全访问另一个类的私有成员,可以把整个类声明为友元。

Python开发网站指南 WORD版
Python开发网站指南 WORD版

本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

适用场景: 比如一个管理类需要访问多个其他类的内部状态。

class Helper;

class Data {
private:
    int secret;
public:
    Data(int s) : secret(s) {}
    friend class Helper; // Helper是Data的朋友
};

class Helper {
public:
    void showSecret(Data& d) {
        std::cout << "Secret: " << d.secret << std::endl; // 合法,因为是友元类
    }
};

这样,Helper类中的所有成员函数都可以访问Data的私有成员。


3. 使用友元函数重载运算符

这是friend最常见的用途之一。当你想让两个对象相加、比较或者输出到流中时,通常会用友元函数实现。

例如,重载操作符用于输出:

class Point {
private:
    int x, y;
public:
    Point(int a, int b) : x(a), y(b) {}
    friend std::ostream& operator<<(std::ostream& os, const Point& p);
};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    os << "(" << p.x << ", " << p.y << ")";
    return os;
}

这样你就可以直接写:

Point p(3, 4);
std::cout << p; // 输出 (3, 4)

几个注意事项:

  • 友元关系 不是双向的:A是B的朋友,不代表B是A的朋友。
  • 友元关系 不能继承:子类不会自动拥有父类的友元权限。
  • 尽量少用friend:它破坏了封装性,只有在确实需要访问私有成员时才考虑。

基本上就这些。用得不多但关键时刻很有用,别滥用就行。

相关专题

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

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

1435

2023.10.24

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

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

222

2024.02.23

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

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

84

2025.10.17

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

29

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

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

31

2025.12.30

热门下载

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

精品课程

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

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.5万人学习

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

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