C++日记——Day14:友元函数、友元类、友元成员函数

友元函数:

public、protected、private:

只要让func成为类Man的友元函数,那么func这个函数就可以访问Man的所有成员,private,protected,public

//Man.h
class Man{
private:
    int Age;
    friend void func(const Man &temp_man); //不属于类,不受public、private、protected的影响
};


//func.h
#ifndef __FUNC__
#def __FUNC__

#include "Man.h"
#include <iostream>

void func(const Man &temp_man);

#endif

//------------------------------------------------------------------
//func.cpp

#include "func.h"

void func(const Man&temp_man){
    cout << "test" << endl;
}

这个函数不属于类,所以不受public、protected、private的影响

总结:友元函数func():通过声明为友元函数,它就能访问这个类的所有成员,包括public、protected、private

 

友元类:类 可以把其他的类定义成友元类。如果你是我的友元类,那么你就可以在你的成员函数中访问我的所有成员

class A{
private:
    int data;
};

class B{
public:
    void callA(int x, A &a){
        a.data = x;             //报错,无法访问
        cout << a.data << endl;
    }

};

我们修改类A,使得类B成为类A的友元类。


Class B; //声明
class A{
private:
    int data;
    friend class B; //这就是友元类的声明,虽然此时B没有定义但是系统没有报错,如果报错可以加一个类B声明
};

class B{
public:
    void callA(int x, A &a){
        a.data = x;            
        cout << a.data << endl;
    }

};

注意:

每个类自己负责自己的友元类和友元函数;

有缘关系不能被继承

友元关系是单向的,比如上边类B是类A的友元类,但这并不表示类A是类B的友元类;

友元关系没有传递性,比如B是A的友元类,C是B的友元类,这并不代表C是A的友元类。

 

友元成员函数:

写这种友元成员函数必须是public权限必须要有代码组织结构,因为这里边有声明和定义这种依赖关系。

//A.h
#include "B.h"
class A{
private:
    int data;
    int name;
    friend void B::callA(int x, A &a); //友元成员函数
};


//B.h
class A;
class B{
public:
    void callA(int x, A &a){
        a.data = x;
    }
    
};

//file.cpp

#include "A.h"
#include "B.h"

int main(){
    A a;
    B b;
    b.callA(1, a);
}

优点:允许在特定情况下,某些非成员函数访问类的protected,private成员,从而提出友元这个概念;使访问protected与private成员更灵活。

缺点:破坏了类的封装性,降低了类的可靠性和维护性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值