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

目录

引言

🍃友元的介绍

🍃友元函数

🍃友元类

🍃相关规则的用法

结语

引言

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

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

🍃友元的介绍

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

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

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

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

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

🍃友元函数

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

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

语法

arduino 复制代码
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)。

注意事项

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

🍃友元类

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

语法

arduino 复制代码
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. 友元成员函数的声明
    • 友元成员函数是在一个类中声明的成员函数,但被声明为另一个类的友元函数。
    • 友元成员函数可以访问被授权类的私有成员。

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

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

相关推荐
宫水三叶的刷题日记3 分钟前
馋猫外卖:AI 让字节式试错没有天花板
后端
SomeB1oody42 分钟前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
罗超驿1 小时前
SpringBoot 快速入门
java·spring boot·后端
卷无止境1 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
newerp2 小时前
Redis 操作与缓存策略
后端·程序员·go
newerp2 小时前
GORM ORM 基础
后端·程序员·go
小岛前端2 小时前
AI Skills 已经封神,但新的问题却越来越严重!
前端·后端·github
拖孩2 小时前
一个人 + AI 做的小程序,上线 15 天赚了 10 块 5
前端·后端·微信小程序
newerp2 小时前
CRUD 操作与预处理语句
后端·程序员·go
wei_shuo2 小时前
KES 数据同步与ETL实战:数据集成、转换与实时同步方案
后端