c++友元

1.友元的做用函数

  友元函数是指某些虽然不是类成员函数却可以访问类的全部成员的函数。用法就是在一个类中声明一个函数做为这个类的友元函数。spa

  友元类的全部成员函数都是另外一个类的友元函数,均可以访问另外一个类中的全部成员(包括私有成员和保护成员)。当但愿一个类能够存取另外一个类的私有成员时,能够将该类声明为另外一类的友元类。用法就是在一个类中声明一个类做为这个类的友元类。code

2.友元函数blog

  [1]友元函数就是说在这个函数里面能够访问这个类的全部成员,一个函数能够是多个类的友元函数。继承

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

  [3]友元函数能够是其余类的成员函数。编译

  例如:class

#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]友元类里面的全部成员函数均可以访问另外一个类的全部成员。demo

  [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;
}
相关文章
相关标签/搜索