C++从0到1的入门级教学(十一)——友元
【摘要】
文章目录
11 友元11.1 全局函数做友元11.2 友元类11.3 成员函数做友元
11 友元
让我们引入一个例子来讲述友元是什么。
生活中你的家有客厅,有卧室,客厅所有来的客人都...
11 友元
让我们引入一个例子来讲述友元是什么。
生活中你的家有客厅,有卧室,客厅所有来的客人都可以进去,但是你的卧室是私有的。对于认识的人来说你可以允许它进去,但是对于陌生人你就不是很欢迎了。
同样地,我们把这个例子引申到类上,那么我们的友元就变成了,一个类允许另外一个类拥有访问自己的私有权限。
如果要指定友元类,只需加上关键字friend。我们来看一下它的三种实现方式:
- 全局函数做友元
- 类做友元
- 成员函数做友元
11.1 全局函数做友元
让我们看一下全局函数做友元的简单用法:
#include <iostream>
using namespace std;
#include <string>
class Building
{
friend void goodGay(Building& building);//!侬,指定这个函数为Building的好朋友
public:
Building()
{
m_SittingRoom = "客厅";
m_Bedroom = "卧室";
};
string m_SittingRoom;
private:
string m_Bedroom;
};
//全局函数
void goodGay(Building &building)
{
cout << "友元全局函数正在访问:" << building.m_SittingRoom << endl;
cout << "友元全局函数正在访问:" << building.m_Bedroom << endl;
}
void test01()
{
Building building;
goodGay(building);
}
int main()
{
test01();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
out:

11.2 友元类
让我们在来看看友元类是怎么一回事,这个实际上不必多说,只要你试着敲一下下面的代码,即可体会其思想。
#include <iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:
GoodGay();
void visit();//参观函数 访问Building中的属性
Building* building;
};
class Building
{
friend class GoodGay;
public:
Building();
string m_SittingRoom;
private:
string m_BedRoom; //卧室
};
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
//创建建筑物对象
building = new Building;
}
void GoodGay::visit()
{
cout << "友元类正在访问:" << building->m_SittingRoom << endl;
cout << "友元类正在访问:" << building->m_BedRoom << endl;
}
void test01()
{
GoodGay gg;
gg.visit();
}
int main()
{
test01();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
out:

11.3 成员函数做友元
同样地,成员函数做友元和类做友元也是大同小异,如下所示:
#include <iostream>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay();
void visit1();//这个函数可以访问Building的私有成员
void visit2();//这个函数不可以访问Building的私有成员
Building* building;
};
class Building
{
friend void GoodGay::visit1();
public:
Building();
string m_SittingRoom;//客厅
private:
string m_BedRoom;//卧室
};
//类外实现成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
building = new Building;
}
void GoodGay::visit1()
{
cout << "visit1 函数正在访问:" << building->m_BedRoom << endl;
cout << "visit1 函数正在访问:" << building->m_SittingRoom << endl;
};
void GoodGay::visit2()
{
// cout << "visit2 函数正在访问:" << building->m_BedRoom << endl;
cout << "visit2 函数正在访问:" << building->m_SittingRoom << endl;
};
void test01()
{
GoodGay gg;
gg.visit1();
gg.visit2();
}
int main()
{
test01();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
out:

文章来源: blog.csdn.net,作者:ArimaMisaki,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/chengyuhaomei520/article/details/123997800
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)