#C++ #面向对象 #趣味编程

# 友元函数和类

    通俗讲法:友元就是和自己很亲密关系很好,能够任意访问原类的私有private和protected的成员或者属性。

比喻:你是小刚,小强和你是好朋友,你的房间不仅你的家人能出入,而且小刚也可以随意进入。友元函数和友元类的本质是一样的,只是作用范围有所区别,一个作用范围是函数,一个作用范围是一整个类。

0-友元函数声明

1.声明方法

(在类内部,先正常定义再在函数定义语句前加一个friend)

class ClassName {
    friend 返回类型 函数名(参数列表); // 不是成员函数,无this指针
};

eg:
    
class MyClass{
    friend void func(MyClass &obj);
};

2-定义方法:

(在类外部,普通全局函数)

//类似全局函数定义方法
返回类型 函数名(参数列表) {
    // 可直接访问该类的私有成员
}

void func(MyClass &obj){
    // 可直接访问私有成员
}

1-友元函数趣味例子

# 接下来讲一个友元函数的例子

以我的蓝牙耳机为例:

cpp

#include <iostream>

#include <string>

using namespace std;

class MyEarphones{

public:

    string name = "OPPO_A5";

    int connect(MyEarphones &earphone);

    bool connected = 0;

private:

    friend void Switch_modes(MyEarphones &earphone);

    int passwd = 2005;

};



int MyEarphones::connect(MyEarphones &earphone){

    cout<<"配对中......密码为:"<< earphone.passwd << endl;

    cout<<"滴答滴答!"<< earphone.name <<"的蓝牙已连接~" << endl;

    earphone.connected = 1;

    return 1;

}



void Switch_modes(MyEarphones &earphone){

    cout<<"蓝牙耳机的密钥是:"<< earphone.passwd << endl;

    if(earphone.connected){

        cout<<"检测到蓝牙已连接"<< endl;

    }

    cout<<"音频输入模式...滋滋滋(电磁声)"<< endl;

}



int main()

{

    MyEarphones oppo;

    cout<<"------------------正常访问name部分---------------------"<<endl;

    cout<<"型号:"<< oppo.name << endl;

    //cout<<"本机密钥:"<< oppo.passwd<< endl;

    cout<<"------------------connect调用部分---------------------"<<endl;

    oppo.connect(oppo);

    cout<<"-------------友元函数-> 模式切换调用部分----------------"<<endl;

    Switch_modes(oppo);

}

程序运行结果:

2-基于三国剧情之典韦之死

        曹操征张绣时,因贪恋张绣婶婶邹氏美色,强纳为妾,并设宴作乐。此举激怒已投降的张绣,感觉受辱,遂在谋士贾诩建议下突然反叛。曹操因色心招致大祸,仓皇逃命,代价是猛将典韦、长子曹昂、侄子曹安民战死。这场因私欲引发的惨剧,成为曹操一生中极为惨痛的教训。

感兴趣的可以点这个抖音链接看一下:https://www.douyin.com/root/search/%E5%85%B8%E9%9F%A6%E4%B9%8B%E6%AD%BB?

代码如下:

#include <iostream>
using namespace std;

//张绣的婶娘类
class Zhang_Wife{
private:
    string name = "邹氏";
    string secret = "闺房秘事";

public:
    //声明曹操为友元类(暗示张绣归降)
    friend class Cao;
    void NO(){
        cout<<name<<"压根不理睬~"<<endl;
    }
};
//曹操类
class Cao{
private:
    string name = "曹操";
public:
    //曹操的所有成员函数都能访问张绣婶娘的私有信息
    void visitGuest(Zhang_Wife &wife){
        cout << name <<"以客人身份拜访"<<endl;
        cout << "正常接触"<<endl; //张绣婶娘受到威胁不得不从
    }
    void abusePower(Zhang_Wife &wife){
        //越界行为
        cout<<"敢问夫人姓氏?"<<endl;
        cout<<"夫人曰:我张济之妻"<<wife.name<<endl;
        cout<<name<<"要求夫人伺候"<<endl;
        cout<<wife.secret<<endl;//编译出错
        cout<<"这就是朋友妻不可欺的反面教材!"<<endl;
    }
};

//正常客访问
class NormalGuest{
public:
    void visit(Zhang_Wife &wife)
    {
        cout<<"敢问夫人姓氏?"<<endl;
        //cout<<wife.name;
        //cout<<wife.secret;//编译出错
        wife.NO();
    }
   
};

int main()
{
    Zhang_Wife zou;
    Cao caocao;
    NormalGuest people;
    cout<<"普通人正常社交..."<<endl;
    people.visit(zou);

    cout<<"曹操名场面..."<<endl;
    caocao.visitGuest(zou);
    caocao.abusePower(zou);
    cout<<"最终张绣因此反叛,典韦被算计,曹昂战死"<<endl;
    return 0;

}

运行结果:

更多推荐