C++篇之友元函数与友元类

本文详细介绍了C++中的友元机制,包括友元函数和友元类的概念、声明及调用方式。解释了友元如何允许特定函数或类访问另一个类的非公有成员,同时探讨了其对封装性的影响及使用的注意事项。
  1. friend机制允许一个类将对其非公有成员的访问权授予指定的函数或类。

    1 友元的声明以关键字friend开始,只能出现在类定义的内部,但可以出现在类中的任何
    地方(因为友元函数是类外的函数,所以它的声明可以放在类的私有段或共有段没有区
    别,不是这个类的类成员所以它的访问控制不受出现在什么地方的影响)
    2.友元关系是授予的,
    3 友元关系是不对称的。
    4.友元会破坏封装性(友元函数友元类能访问被授予友元的那个类的私有变量),尽量
    不使用友元函数,除非不得已的情况下才使用友元函数。优点是:在实现类之间的数据
    共享时,减少系统开销,提高效率,表达简单清晰。
    

    2.友元函数的参数:

        因为友元函数没有this指针,则参数有三种情况:
        1 访问非static成员时,需要对象做参数,(也可以没有参数,在内部再定义一个
        对象)。
        2 访问static成员时,不需要对象做参数。,因为static成员是共用的不属于哪一个
        对象,存储在.data段和全局变量的存储类相同
        3 如果做参数的对象是全局对象,则不需要对象做参数。
    

    3.友元函数的调用

    可以直接调用友元函数,不需要通过通过对象或指针。
    
这里写代码片
class A{
    public:
        void initialize(void);
        friend void g(A *, int);//函数g是类A的友元函数
        friend void B::f(A *);//B的成员函数f是类B的友元函数
        friend class C;//类C是类A的友元,使用单个声明使C类的所有成员函数为A类的
        //友元,它提供一种类之间合作的一种方式,使类C的对象具有类A和类C的功能
        friend void h(void);//函数h是A的友元函数

    private:
        int i;      
};

void A::initializevoid)
{
    i = 0;
}
void g(A *x, int j)//函数g是类A的友元函数
{
    x->i = j;
}
void B::f(A *x)//B的成员函数f是类B的友元函数
{
    x->i = 50;
}
class C{
    public:
        void initialize();
        void g(A *x);

    private:
        int k;
}
void C::initialize()
{
    j = 99;
}
void C::g(A *x)
{
    x->i += k;//借助友元,在C类的成员函数g(A *x)中,借助A的对象,直接访问A的
    //私有变量
}
void h()  //函数h是A的友元函数
{
    A x;//也可以没有参数,在内部再定义一个对象
    x.i = 100;
}
void main(void)
{
    A *a;
    g(a, 10);//友元函数直接调用,参数是一个对象
    h();//友元函数直接调用,没有参数,但是内部定义了一个被授予友元的那个类的对象
    C c;//C类是A的友元类
    c.g(a);//借助友元,在C类的成员函数g(A *x)中,借助A的对象,直接访问A的
    私有变量)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值