C++友元函数与友元类

一  友元函数的定义与调用 

       C++类除了成员函数,静态成员函数,还有一种函数:友元函数。

       友元函数和类一种朋友关系,它不属于类,但可以访问类的私有成员,它和类是一种朋友关系,也不需要用类的对象去驱动,例如下面的代码:

#includeusing namespace std;

class ASD{
    friend int getData(const ASD& asd);

private:
    int m_Value;

public:
    ASD(int value = 0):m_Value(value){}
    ~ASD(){}
};

int getData(const ASD& asd)
{
    return asd.m_Value;
}

int main() {
    ASD obj(123);
    cout << "m_Value = " << getData(obj) << endl;

    return 0;
}

      getData是类ASD的友元函数,在大括号里声明,在外面定义,不需要作用域限定符,调用的时候就和全局函数一样的调用。

二 友元函数的应用

     友元函数经常应用于运算符重载。例如下面的代码,实现数和对象相加

#includeusing namespace std;

class Fushu
{
    friend Fushu operator+(int i, const Fushu& fu);

private:
    int m_Real;
    int m_Xu;

public:
    Fushu(int real, int xu)
    {
        m_Real = real;
        m_Xu = xu;
    }

    int getReal()
    {
        return m_Real;
    }

    int getXu()
    {
        return m_Xu;
    }
};

Fushu operator+(int i, const Fushu& fu)
{
    int real = i + fu.m_Real;
    int xu = fu.m_Xu;
    return Fushu(real, xu);
}

int main()
{
    Fushu f1(3, -2);
    Fushu f2 = 4 + f1;

    cout << f2.getReal() << f2.getXu() << "i" << endl;

    return 0;
}

三 友元类

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

关于友元类的注意事项:

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

代码如下:

#includeusing namespace std;

class A
{
    friend class C;  //这是友元类的声明, C是A的友元类

private:
    int data;
};

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

int main(void)
{
    class A a;
    class C c;

    c.show(1, a);    //C的对象访问A的成员

    return 0;
}

           总结:友元可以访问类的私有属性,但破坏了类的封装性。

上一篇:asd


下一篇:[ARC119E] Pancakes (二维偏序,分类讨论)