C++友元

友元

友元的目的就是让一个函数或者类 访问另一个类中私有成员

友元的关键字为 friend

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

全局函数做友元(友元函数)

友元函数是指某些虽然不是类成员函数却能够访问类的所有成员的函数。类授予它的友元特别的访问权,这样该友元函数就能访问到类中的所有成员。

class A {
public:
    friend void Show(int x, A &a);  /// 该函数是友元函数的声明
private:
    int data;
};

void set_show(int x, A &a) { 
    /// 友元函数定义,为了访问类A中的成员
    a.data = x;
    cout << a.data << endl;
}

类做友元(友元类)

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。

关于友元类的注意事项:

  • 1.友元关系不能被继承。
  • 2.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  • 3.友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
class A {
public:
    friend class C;  /// 这是友元类的声明
private:
    int data;
};


class C {            /// 友元类定义,为了访问类A中的成员
public:
    void Show(int x, A &a) {
        /// 类C可以访问类A中的私有成员 data
         a.data = x;  
         cout << a.data << endl;
    }
};

成员函数做友元

使类B中的成员函数成为类A的友元函数,这样类B的该成员函数就可以访问类A的所有成员了。

当用到友元成员函数时,需注意友元声明和友元定义之间的相互依赖,在该例子中,类B必须先定义,否则类A就不能将一个B的函数指定为友元。然而,只有在定义了类A之后,才能定义类B的该成员函数。更一般的讲,必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。

class A;  /// 当用到友元成员函数时,需注意友元声明与友元定义之间的互相依赖。这是类A的声明

class B {
public:
    void BShow(int x, A &a);  /// 该函数是类A的友元函数,类B中定义了类A
};

class A {
public:
    friend void B::set_show(int x, A &a);   //该函数是友元成员函数的声明
private:
    int data;
    void AShow() {
         cout << data << endl; 
    }
};

void B::set_show(int x, A &a) {  //只有在定义类A后才能定义该函数,毕竟,它被设为友元是为了访问类A的成员
    a.data = x;
    cout << a.data << endl;
}
posted @   Bdathe  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示