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;
}
相關文章
相關標籤/搜索