首页 > 编程语言 >为什么C++友元函数必须在类内部声明?解析与案例

为什么C++友元函数必须在类内部声明?解析与案例

时间:2024-06-09 11:32:03浏览次数:13  
标签:友元 函数 私有 成员 C++ 访问 showX 解析

友元函数是C++中独特的编程结构,允许一个非成员函数或者其他类访问另一个类的私有和保护数据成员。友元在很多情况下是非常有用的,比如操作符重载、类间紧密合作等。

为什么需要在类内部声明友元函数?

  1. 访问权限:友元函数需要访问类的私有和保护数据成员。为此,必须在类内部声明,以便编译器知道哪些函数是友元函数,从而允许它们访问这些成员。
  2. 编译器的需求:C++ 编译器在解析代码时,需要明确哪些函数被授予了访问权限。如果没有在类内部声明友元函数,编译器将无法识别并授予访问权限。
  3. 意图表达:在类内部声明友元函数可以明确表达程序设计者的意图:即特定函数是类的友元,允许它们访问私有和保护成员。这提升了代码的可读性和维护性。

友元函数的示例代码与注释

以下是一个简单的示例,演示了友元函数的定义和使用:

#include <iostream>
using namespace std;

// 类A的声明
class A {
private:
    int x; // 私有成员变量

public:
    A(int val) : x(val) {} // 构造函数

    // 声明friend函数,允许它访问私有成员变量
    friend void showX(const A& obj); 
};

// 友元函数的定义
void showX(const A& obj) {
    // 无法直接访问私有成员变量x,除非被声明为友元
    cout << "Value of x is: " << obj.x << endl;
}

int main() {
    A a(5); // 创建一个A对象,其x值为5
    showX(a); // 调用友元函数,输出私有成员变量x的值

    return 0;
}
代码解释:
  • 类A

    • private 访问说明符下的 int x 是 A 类的私有成员变量。
    • A(int val) : x(val) {} 是构造函数,用于初始化 x
    • friend void showX(const A& obj); 这一行在类 A 的内部声明了 showX 为朋友函数,使其能访问 A 类的私有成员。
  • 友元函数showX

    • void showX(const A& obj) 在类 A 外部定义。
    • 它使用对象 obj 访问其私有成员变量 x
  • main函数

    • 创建一个 A 类的实例对象 a,并将其 x 值初始化为 5
    • 调用 showX(a),输出 a 对象的私有成员变量 x 的值。

总结

友元函数通过在类内部声明,使得对私有和保护成员的访问成为可能。它们有助于结构紧密的类之间的合作,同时保持封装性的其他优势。通过上面的示例,可以清晰地看到友元函数的声明和使用方式,为编程提供了强大而灵活的手段。

标签:友元,函数,私有,成员,C++,访问,showX,解析
From: https://blog.csdn.net/m0_72877724/article/details/139559618

相关文章

  • 栈经典题目(C++)
    文章目录前言一、删除字符串中的所有相邻重复项1.题目解析2.算法原理3.代码编写二、基本计算器II1.题目解析2.算法原理3.代码编写三、字符串解码1.题目解析2.算法原理3.代码编写四、验证栈序列1.题目解析2.算法原理3.代码编写总结前言一、删除字符串中的所有......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-005 考试座位号
    L1-005考试座位号每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着......
  • 【机器学习基础】Python编程07:五个实用练习题的解析与总结
    Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面:简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些库提供了......
  • 【机器学习基础】Python编程08:五个实用练习题的解析与总结
    Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面:简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些库提供了......
  • 【源码】Spring Data JPA原理解析之事务执行原理
     SpringDataJPA系列1、SpringBoot集成JPA及基本使用2、SpringDataJPACriteria查询、部分字段查询3、SpringDataJPA数据批量插入、批量更新真的用对了吗4、SpringDataJPA的一对一、LazyInitializationException异常、一对多、多对多操作5、SpringDataJPA自定义......
  • 深入浅出,解析ChatGPT背后的工作原理
    自ChatGPT发布以来,已经吸引了无数人一探究竟。但ChatGPT实际上是如何工作的?尽管它内部实现的细节尚未公布,我们却可以从最近的研究中一窥它的基本原理。ChatGPT是OpenAI发布的最新语言模型,比其前身GPT-3有显著提升。与许多大型语言模型类似,ChatGPT能以不同样式、不......
  • 深入解析:MySQL连接超时问题排查与优化策略
    引言​在现代企业应用中,数据库的稳定性和响应速度是保证业务连续性的关键。MySQL作为广泛使用的数据库系统,其连接超时问题可能成为性能瓶颈,影响用户体验和业务效率。本文将深入探讨MySQL连接超时的原因、影响以及优化策略。超时配置详解​查看当前设置​要了解MySQL......
  • UE4动作游戏实例RPG Action解析-导语
    UE实战篇(动作游戏)概述解析官方示例游戏《动作RPG》动作角色扮演游戏示例项目(简称ARPG)是一个快节奏的第三人称砍杀类游戏本篇作用是从零开始写官方示例游戏重要部分,学完这篇再去研究官方示例,会轻松很多学完会获取以下知识:1.Unreal写一个C++项目2.学习UnrealGAS系......
  • C++ 对拍
    准备timeb毫秒级随机数文件这里以P1001A+BProblem为例。std.cpp-std.exe(std.lnk)#include<bits/stdc++.h>usingnamespacestd;signedmain(){intx,y;cin>>x>>y;cout<<x+y<<endl;return0;}force.cpp-force.exe#......
  • vscode编译c/c++找不到jni.h文件
    解决办法:一、下载JDK访问Oracle官网的Java下载页面:JavaDownloads|Oracle选择适合您操作系统的JDK版本:对于Windows,选择“Windowsx64”或“Windowsx86”(取决于您的系统是64位还是32位)。对于Linux,选择适合您Linux发行版的压缩包。对于Mac,选择“.dmg”或“.pkg”安装......