C++小课堂——friend友元

文章目录

在C++中,friend 关键字用于声明友元(friend)。友元是一种机制,允许某个函数 (可以是其它类的成员函数,或者是某个外部函数)或 访问另一个类的私有成员。friend 关键字可以用于函数、类、或整个类的成员函数。
一般来说,最好在类定义开始或结束前的位置集中声明友元。

1. 友元函数

cpp 复制代码
class MyClass {
private:
    int privateMember;

public:
    MyClass(int value) : privateMember(value) {}

    // 声明友元函数
    friend void friendFunction(const MyClass& obj);
};

// 定义友元函数,可以访问私有成员
void friendFunction(const MyClass& obj) {
    std::cout << "Friend Function: " << obj.privateMember << std::endl;
}

int main() {
    MyClass obj(42);

    // 调用友元函数
    friendFunction(obj);

    return 0;
}

在这个例子中,friendFunction 被声明为 MyClass 的友元函数,因此它可以访问 MyClass 的私有成员 privateMember

2. 友元类

cpp 复制代码
class MyClass {
private:
    int privateMember;

public:
    MyClass(int value) : privateMember(value) {}

    // 声明友元类
    friend class FriendClass;
};

// 友元类可以访问私有成员
class FriendClass {
public:
    void accessPrivateMember(const MyClass& obj) {
        std::cout << "FriendClass accessing private member: " << obj.privateMember << std::endl;
    }
};

int main() {
    MyClass obj(42);

    // 创建友元类的对象
    FriendClass friendObj;

    // 调用友元类的函数,访问私有成员
    friendObj.accessPrivateMember(obj);

    return 0;
}

在这个例子中,FriendClass 被声明为 MyClass 的友元类,因此它可以访问 MyClass 的私有成员。

如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员

3. 友元成员函数

cpp 复制代码
class MyClass {
private:
    int privateMember;

public:
    MyClass(int value) : privateMember(value) {}

    // 声明友元成员函数
    friend void FriendFunction(const MyClass& obj);
};

// 定义友元成员函数,可以访问私有成员
void FriendFunction(const MyClass& obj) {
    std::cout << "Friend Function: " << obj.privateMember << std::endl;
}

int main() {
    MyClass obj(42);

    // 调用友元成员函数
    FriendFunction(obj);

    return 0;
}

这个例子中,FriendFunction 被声明为 MyClass 的友元成员函数,允许它访问 MyClass 的私有成员。


友元关系不存在传递性

必须要注意的一点是,友元关系不存在传递性。也就是说,每个类负责控制自己的友元类或友元函数。(朋友的朋友不是我的朋友)


友元小结

  • 友元关系不能被继承(爸爸的朋友不一定是儿子的朋友)。
  • 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  • 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的声明。

使用友元机制需要注意,因为它打破了封装性,可能导致代码的耦合性增加。因此,在使用友元时应慎重考虑设计。友元的设计可以在某些情况下提供更灵活的访问权限,但通常应当优先考虑良好的封装性。

相关推荐
C嘎嘎嵌入式开发21 小时前
(2)100天python从入门到拿捏
开发语言·python
Stanford_11061 天前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台
@小博的博客1 天前
【Linux探索学习】第二篇Linux的基本指令(2)——开启Linux学习第二篇
linux·运维·学习
Vallelonga1 天前
Rust 中的数组和数组切片引用
开发语言·rust
Kiri霧1 天前
Rust模式匹配详解
开发语言·windows·rust
white-persist1 天前
Python实例方法与Python类的构造方法全解析
开发语言·前端·python·原型模式
千里马-horse1 天前
Async++ 源码分析8--partitioner.h
开发语言·c++·async++·partitioner
Lucis__1 天前
再探类&对象——C++入门进阶
开发语言·c++
007php0071 天前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
知识分享小能手1 天前
微信小程序入门学习教程,从入门到精通,微信小程序核心 API 详解与案例(13)
前端·javascript·学习·react.js·微信小程序·小程序·vue