首页 > 编程语言 >什么是 C++ 中的友元函数和友元类?友元的作用是什么?有什么注意事项?

什么是 C++ 中的友元函数和友元类?友元的作用是什么?有什么注意事项?

时间:2024-11-19 19:14:08浏览次数:3  
标签:友元 函数 私有 成员 C++ 访问 友元类

友元函数

定义

友元函数是在类中声明的非成员函数,它可以访问类的私有(private)和保护(protected)成员。友元函数虽然不是类的成员函数,但它被授予了访问类内部成员的特殊权限。

声明方式

在类的定义中,使用friend关键字来声明友元函数。

class MyClass {
private:
    int privateData;
    friend void friendFunction(MyClass& obj);
};

void friendFunction(MyClass& obj) {
    obj.privateData = 10;  // 可以访问私有成员
}

友元类

定义

友元类是指一个类可以访问另一个类的私有(private)和保护(protected)成员。如果类 A 是类 B 的友元类,那么类 A 的所有成员函数都可以访问类 B 的私有和保护成员。友元关系是单向的,不具有传递性。如果类A是类B的友元,类B不一定是类A的友元

声明方式

在类的定义中,使用friend关键字来声明友元类

class FriendClass {
private:
    int privateData;
public:
    FriendClass() : privateData(0) {}
    friend class OtherClass;  // 声明 OtherClass 是 FriendClass 的友元类
};

class OtherClass {
public:
    void accessPrivateData(FriendClass& obj) {
        obj.privateData = 42;  // 可以直接访问 FriendClass 的私有成员
    }
};

作用

在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。

注意事项

封装性破坏风险

友元关系最大的风险在于它打破了类的封装性。类的封装原则是将数据隐藏起来,只通过成员函数来访问和修改数据。当使用友元时,外部的函数(友元函数)或者类(友元类)可以直接访问私有和保护成员,这可能会导致数据被意外地修改或者访问。

谨慎使用友元函数和友元类的继承关系

友元关系不会被继承。如果类 A 是类 B 的友元类,类 A 的子类不会自动成为类 B 的友元类。同样,类 B 的子类也不会自动继承和类 A 的友元关系。

避免过度使用

应该谨慎地使用友元。只有在确实有必要的情况下,如为了实现高效的操作符重载或者两个紧密相关的类之间需要特殊的访问权限时才使用。过度使用友元会使代码的结构变得松散,违背面向对象编程的封装原则。

参考文献C++友元函数和友元类-CSDN博客

标签:友元,函数,私有,成员,C++,访问,友元类
From: https://blog.csdn.net/m0_73949707/article/details/143865599

相关文章

  • c++等级考试第8级第2卷
                                       道路(2024.3八级)代码#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<vector>#include<cstring>usingnamespacestd;st......
  • 【入门】字符串的反码c++
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ //一、分析问题 //已知:一个长度不超过80个字符的字符串。 //未知:字符串的反码。 //关系:如果这是一个小写字符,则它和字符a的距离与它的反码和字符z的距离相同;如果是一个大写字符,则它和字符A的距离与它......
  • 在bug中巩固C++
    记录自己的各种报错,在错误中学习ing结构体全局变量的声明与初始化问题#include<iostream>usingnamespacestd;//声明一个结构体BooksstructBook{stringname;stringauthor;stringsubject;intid;//构造函数Book(stringname,stringa......
  • 【C++】十六进制数据的字节序排列问题、大小端
    十六进制数据的字节序排列问题,涉及到大小端(Endianness)的概念。包括它与大小端存储方式的关系。1.十六进制数据在内存中的存储定义的数据#defineFRAME_TYPE_PARAM_SET0x30010x3001是一个16位(2字节)整数。在内存中,0x3001的存储方式依赖于系统的字节序:小端......
  • C++编程:通过多线程与协程优化阻塞型任务的调度性能
    文章目录0.引言1.多线程VS多线程+协程1.1示例1:使用传统的多线程进行矩阵乘法1.2.示例2:使用协程优化阻塞型任务3.分析与对比0.引言我们知道:多线程:适用于处理计算密集型任务或IO操作较少的场景,但会因为线程切换和创建销毁的开销而影响性能。协程:适用于处......
  • 实验4 C++
    任务2:GradeCalc.cpp1#pragmaonce2#include<iostream>3#include<vector>4#include<string>5#include<algorithm>6#include<numeric>7#include<iomanip>89usingstd::vector;10usingstd::......
  • C++ 学习笔记(1):STL、Vector 与 Set
    背景最近在尝试入坑蓝桥杯,于是先从C++开始学起,这里记个笔记。这里我的笔记是跟着这个教程来的。沙比学校天天整些屁事都没什么空折腾。前言笔者是JS/TS写的比较多,以前写过C但是有点忘了,所以文章里都是和JS进行对比着方便快速理解。同时其实我还有几个小问题,嘻嘻。没......
  • C++中的友元函数和友元类&友元的作用及注意事项
    1.C++中的友元函数和友元类友元函数:友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常,同一个开发者会出于技术和非技术的原因控制类的友元和成员函数,否则在更新类时,还需要征得其他部分的拥有者的同意。友元函数在定义上和调用......
  • 打卡信奥刷题(264)用C++信奥P2010[普及组/提高] [NOIP2016 普及组] 回文日期
    [NOIP2016普及组]回文日期题目背景NOIP2016普及组T2题目描述在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用888位数字表示一......
  • 详解 C++ 的内存序模型
    详解C++的内存序模型C++提供了内存序模型来控制多线程程序中不同线程对共享内存的访问顺序。最常用的是顺序一致性内存模型(memory_order_seq_cst),但它也提供了其他模型(如memory_order_relaxed)以优化性能。一、顺序一致性内存模型(memory_order_seq_cst)定义顺序一致性......