当前位置: 首页 > article >正文

【C++指南】类和对象(七):友元

           💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

 

47f09392526c71b5885ec838a3ea7ffe.gif

目录

引言

🍃友元的介绍

🍃友元函数

🍃友元类

🍃相关规则的用法

结语


 

引言

在C++编程语言中,友元是一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。

友元关系可以是函数与类之间,也可以是类与类之间。友元机制虽然增强了类的灵活性,但也破坏了封装性,因此在使用时需要谨慎

🍃友元的介绍

友元关系在C++中是一种单向的、非传递的关系

当一个类或函数被声明为另一个类的友元时,它能够绕过访问权限进行访问,即使这些成员在普通情况下对外是不可见的。

友元的声明通常放在类的定义中,位于publicprotectedprivate之外,使用friend关键字进行声明。

友元函数和友元类的声明确实可以在类定义的任何地方进行,且不受类访问限定符(如publicprotectedprivate)的限制

⼀个函数可以是多个类的友元函数,一个类也可以是多个类的友元类。 

 

🍃友元函数

友元函数是一种特殊的函数,它可以访问类的私有成员,尽管它不是类的成员函数。

友元函数的声明通常位于类的声明中,但其实现则位于类外部。

语法

class MyClass {  
private:  
    int privateData;  
public:  
    MyClass(int data) : privateData(data) {}  
    // 声明友元函数  
    friend void friendFunction(const MyClass& obj);  
    // Getter函数  
    int getPrivateData() const {  
        return privateData;  
    }  
};  
  
// 友元函数实现  
void friendFunction(const MyClass& obj) {  
    cout << "Friend function accessing private data: " << obj.privateData << endl;  
}
使用场景
  • 当需要重载类的操作符(如<<>>+-等)时,友元函数可以访问私有成员,实现合适的操作。
  • 在某些情况下,使用友元函数可以提高程序的执行效率,因为它可以直接访问类的私有成员,而不需要通过访问器函数(getter和setter)。

注意事项

  • 友元函数破坏了类的封装性,可能会降低代码的安全性和可维护性。
  • 当程序变得复杂时,友元函数的使用可能会导致代码变得难以理解和维护。

🍃友元类

友元类是指一个类被声明为另一个类的友元。这意味着被声明为友元的类可以访问另一个类的私有成员,类似于友元函数的概念,但是是对整个类的授权。

语法

class MyClass;  
class FriendClass {  
public:  
    void accessPrivateData(const MyClass& obj);  
};  
  
class MyClass {  
private:  
    int privateData;  
public:  
    MyClass(int data) : privateData(data) {}  
    // 声明友元类  
    friend class FriendClass;  
    int getPrivateData() const {  
        return privateData;  
    }  
};  
  
// 友元类成员函数实现  
void FriendClass::accessPrivateData(const MyClass& obj) {  
    cout << "Friend class accessing private data: " << obj.privateData << endl;  
}
使用场景
  • 友元类通常用于需要多个类之间紧密协作的情况,允许这些类访问彼此的私有成员。

注意事项

  • 友元类同样破坏了类的封装性,需要谨慎使用。
  • 友元关系不具备传递性,即如果A是B的友元,B是C的友元,A不一定是C的友元。

 

🍃相关规则的用法

  1. 友元函数的声明和实现
    • 友元函数在类的内部声明,使用friend关键字。
    • 友元函数的实现位于类外部,可以像普通函数一样进行定义。
  2. 友元类的声明
    • 友元类在目标类中使用friend关键字进行声明。
    • 友元类的所有成员函数都可以访问目标类的私有成员。
  3. 友元关系的单向性和非传递性
    • 友元关系是单向的,即A是B的友元,并不意味着B是A的友元。
    • 友元关系是非传递的,即如果A是B的友元,B是C的友元,A不一定是C的友元。
  4. 友元成员函数的声明
    • 友元成员函数是在一个类中声明的成员函数,但被声明为另一个类的友元函数。
    • 友元成员函数可以访问被授权类的私有成员。

代码示例(友元成员函数)

class FriendClass;  
  
class MyClass {  
private:  
    int privateVar;  
public:  
    MyClass(int val) : privateVar(val) {}  
    // 友元成员函数,声明FriendClass的成员函数为友元  
    friend void FriendClass::accessPrivateVar(MyClass& obj);  
};  
  
class FriendClass {  
public:  
    void accessPrivateVar(MyClass& obj) {  
        // 友元成员函数可以访问MyClass的私有成员  
        int x = obj.privateVar;  
        cout << "Friend class member function accessing private data: " << x << endl;  
    }  
};  
  
int main() {  
    MyClass myObj(42);  
    FriendClass friendObj;  
    friendObj.accessPrivateVar(myObj); // 调用友元类的成员函数  
    return 0;  
}


结语

友元机制在C++中提供了一种灵活的访问控制手段,允许类或函数访问另一个类的私有成员。然而,友元也破坏了类的封装性,可能会降低代码的安全性和可维护性。因此,在使用友元时需要谨慎考虑,确保只有在必要的情况下使用它。

 

 


http://www.kler.cn/a/430625.html

相关文章:

  • kubernetes 高可用集群搭建
  • Starrocks 对比 Clickhouse
  • Python3 + Qt5:实现AJAX异步更新UI
  • 编程AI深度实战:给vim装上AI
  • P7497 四方喝彩 Solution
  • C# 精炼题18道题(类,三木运算,Switch,计算器)
  • html小白初学
  • go语言zero框架对接阿里云消息队列MQ的rabbit的配置与调用
  • Java项目--仿RabbitMQ的消息队列--需求分析
  • PVE修改IP地址
  • 基于 SSM 的个性化商铺系统:先进架构保障系统稳定性
  • el-table手动触发懒加载
  • 【优选算法】哈希表
  • 文件下载和图片预览 Blob FileReader
  • elementUI修改table样式
  • SQL面试题——连续问题 连续点击三次用户
  • 5G中的随机接入过程可以不用收RAR?
  • Android可长按拖拽item的列表
  • U2F和FIDO2 两种安全认证技术优劣势对比
  • 【万字详解】三维重建(二)——NeRF、NeuS、MeshUDF、NeuralUDF、3DGS、GShell
  • C语言单元总结
  • 虚幻引擎游戏开发专题-1-引擎术语
  • 关于转包关系和挂靠关系的认定
  • 【JavaEE初阶】CSS
  • 云贝教育【Oracle技术文章-Oracle 19c之PDB重命名】
  • 网络安全法 -网络信息安全