导航

c++友元

Posted on 2017-11-27 17:46  困或  阅读(280)  评论(0编辑  收藏  举报

1.友元的作用

  友元函数是指某些虽然不是类成员函数却能够访问类的所有成员的函数。用法就是在一个类中声明一个函数作为这个类的友元函数。

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

2.友元函数

  [1]友元函数就是说在这个函数里面可以访问这个类的所有成员,一个函数可以是多个类的友元函数。

  [2]友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的。

  [3]友元函数可以是其他类的成员函数。

  例如:

#include <stdio.h>
#include <stdlib.h>

using namespace std;

class ca;

class cb
{
public:
    void fun(ca &d);    //这个函数的实现要放到下面,在这里实现会因为没有定义类ca的成员变量而编译出错
};

class ca
{
public:
    int m_flag;

    // 普通函数作为类ca的友元函数
    friend void fun(ca &d);

    //类cb的成员函数作为类ca的友元函数
    friend void cb::fun(ca &d);
    
    ca(){
        m_flag = 100;
        m_value = 1000;
    }

private:
    int m_value;
    static int m_value_1;
};

int ca::m_value_1 = 200;

void fun(ca &d)
{
    printf("fun m_flag is    :%d\n", d.m_flag);
    printf("fun m_value is   :%d\n", d.m_value);
    printf("fun m_value_1 is :%d\n", ca::m_value_1);
}

void cb::fun(ca &d)
{
    printf("cb m_flag is     :%d\n", d.m_flag);
    printf("cb m_value is    :%d\n", d.m_value);
    printf("cb m_value_1 is :%d\n", ca::m_value_1);
}

int main()
{
    ca a;  
    cb b;
    
    fun(a);
    b.fun(a);

    return 0;
}

3.友元类

  [1]友元类里面的所有成员函数都可以访问另一个类的所有成员。

  [2]友元关系不能被继承,也没有传递性。这意思就是说类B不能继承类A中的友元;类B是类A的友元,类C是类B的友元,并不是说类C就是类A的友元。总之就是友元只有一层,还是比较简单的。

  例如:

#include <stdio.h>
#include <stdlib.h>

using namespace std;

class demo
{
public:
    int m_flag;

    friend class demo_a;
    
    demo(){
        m_flag = 100;
        m_value = 1000;
    }

private:
    int m_value;
    static int m_value_1;
};

int demo::m_value_1 = 200;

class demo_a
{
public:
    void fun(demo &d){
        printf("m_flag is    :%d\n", d.m_flag);
        printf("m_value is   :%d\n", d.m_value); 
        printf("m_value_1 is :%d\n", demo::m_value_1);
    }

    void fun1(demo &d){
        printf("m_flag is    :%d\n", d.m_flag);
        printf("m_value is   :%d\n", d.m_value); 
        printf("m_value_1 is :%d\n", demo::m_value_1);
    }
};

int main()
{
    demo d;    
    demo_a da;

    da.fun(d);
    da.fun1(d);
    return 0;
}