c++学习:友元关系+有元函数+友元类

友元关系

  • 友元关系是一种在编程中使用的术语,通常用于描述两个类或函数之间的特殊关系。
  • 一个类可以将其他类或者函数声明为"友元"。被声明为友元的类或函数就可以访问该类的私有和保护成员。

作用

  • 在这种关系中,一个类或函数允许另一个类或函数访问其私有和保护成员。这种关系并不依赖于继承,而是通过明确的声明来建立。

友元函数示例

有一个类,类中有一个数据成员,外面有两个函数,只想让一个函数可以访问这个数据成员

复制代码
class MyClass {
private:
    int value;

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

    friend void friendFunction(const MyClass& obj);
};

void friendFunction(const MyClass& obj) {
    std::cout << "The value of MyClass is: " << obj.value << std::endl;
}

void Function(const MyClass& obj) {
    std::cout << "The value of MyClass is: " << obj.value << std::endl;
}

int main() {
    MyClass obj(42);
    friendFunction(obj); // 调用友元函数
    Function(obj); // 调用错误,不是友元函数
    

    return 0;
}

注意:

  • 代码解释
    • friendFunction是一个友元函数,它被声明为MyClass的友元。
    • 友元函数可以直接访问MyClass的私有成员value。
    • friendFunction函数在main函数中被调用,并传递了一个MyClass对象作为参数。
  • 声明友元函数格式是 friend 函数声明;
  • 在类中声明的友元函数中可以调用类中的所有成员
  • 友元的正确使用能提高程序的运行效率,但破坏了类的封装性和数据的隐秘性,导致程序可维护性变差,因此一定要谨慎使用

友元类示例

复制代码
class FriendClass {
public:
    void showValue(const MyClass& obj) {
        std::cout << "The value of MyClass is: " << obj.value << std::endl;
    }
};

class MyClass {
private:
    int value;

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

public:
    MyClass(int num) : value(num) {}
};

int main() {
    MyClass obj(42);

    FriendClass fc;
    fc.showValue(obj); // 通过友元类调用私有成员

    return 0;
}

注意:

  • 代码解释:
    • FriendClass被声明为MyClass的友元类。
    • 因此,FriendClass可以访问MyClass的私有成员value。
    • FriendClass类中的showValue函数可以访问并输出MyClass对象的value成员变量。
    • 在main函数中,我们创建了一个MyClass对象和一个FriendClass对象。
    • 然后,通过FriendClass对象调用showValue函数来访问和输出MyClass对象的value成员变量。
  • 友元关系不能被继承
  • FriendClass可以访问MyClass,但MyClass不可以访问FriendClass
相关推荐
黑马程序员毕设6 分钟前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
我爱cope21 分钟前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络
_Twink1e42 分钟前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心1 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长1 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
苏生Susheng2 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
dong_junshuai2 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
源代码•宸2 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
2601_967338712 小时前
C#上位机开发零基础入门到精通全套视频
开发语言·c#
我命由我123452 小时前
Photoshop - Photoshop 把两个 PSD 文件合并
学习·ui·职场和发展·产品运营·产品经理·学习方法·photoshop