[八股文3]C++之友元函数
·
#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;
}
运行结果:

更多推荐

所有评论(0)