友元概述(需快速查阅看文末总结)
友元:顾名思义,就像朋友一样的元素
- 好比一个人个房屋内,有客厅和卧室,卧室比较私人(private),一般客人无法访问,只能在客厅这个公有环境(public)里面移动.
- 而友元的出现,就好比是自己的好基友来到了家里,可以让好基友进入自己的私人卧室.
友元让private修饰的变量属性不再绝对的私有.在必要的时候可以使用friend关键字
进行修饰访问.
具体用法如下:
全局函数做友元
全局函数是指在类外以及main函数之外的函数叫全局函数,作用域是全局.
bedroom是私有属性,但是可以通过让全局函数变成友元函数来进行访问.
/* 客厅public,卧室 private
但是有特殊权限的,访问私有的内容
要用到友元技术
关键字为friend
三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元 */
#include <iostream>
using namespace std;
#include <string>
class Building
{
// goodgay这个函数是Building的一个好朋友,可以访问里面的私有成员.
friend void goodgay(Building *buliding);
public:
// 建筑物
Building()
{
sittingRoom = "客厅";
bedroom = "卧室";
}
public:
string sittingRoom;
private:
string bedroom;
};
// 全局函数
void goodgay(Building *buliding)
{
cout << "好基友的全局函数正在访问: " << buliding->sittingRoom << endl;
cout << "好基友的全局函数正在访问: " << buliding->bedroom << endl;
}
void test01()
{
Building building;
goodgay(&building);
}
int main()
{
test01();
system("pause");
return 0;
}
友元类
在这个例子中
- GoodGay类创建了一个Building类的指针,那么在GooGay类里面就可以访问Building类的元素
- 但是Building类中的私有成员变量bedroom访问不到
- 在Building类中声明
加上friend关键字的GoodGay类
就可以让类称为友元类,就可以访问Building类中的私有成员.
此外,在类外写构造函数和方法的时候,一定要加上作用域: 类名::函数体
#include <iostream>
using namespace std;
#include<string>
class Building;
class GoodGay{
public:
GoodGay();
void visit(); // 参观函数访问building中的属性
Building *building;
};
class Building{
// goodgay这个类是本类的好朋友,可以访问私有的成员
friend class GoodGay;
public:
Building();
public:
string sittingRoom;
private:
string bedroom;
};
// 类外去写成成员函数
Building::Building(){
sittingRoom = "客厅";
bedroom = "卧室";
}
GoodGay::GoodGay(){
// 创建建筑物的对象
building = new Building;
}
void GoodGay::visit(){
cout<<"好基友的类正在访问"<<building->sittingRoom<<endl;
cout<<"好基友的类正在访问"<<building->bedroom<<endl;
}
void test01()
{
GoodGay gg;
gg.visit();
}
int main()
{
test01();
system("pause");
return 0;
}
成员函数做友元
- 刚刚说明了全局函数来访问私有属性,通过其他类的类内指针来访问私有属性
- 现在还可以通过成员函数来访问私有属性.
我们先创建两个成员函数: visit()和visit2()来进行比较.
这两个成员函数都是GoodGay的成员函数,一开始他们都没有权限去访问Building的私有属性
但是,在Building类中声明了 GoodGay作用域下的visit()函数是"朋友"
,可以访问私有属性,于是visit()函数就可以访问卧室了
一定要记住声明作用域!
#include <iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:
GoodGay();
void visit();
//让visit函数可以访问building中私有成员的内容
void visit2();
//让visit2函数不可以访问building中私有成员的内容.
Building *building;
};
class Building
{
friend void GoodGay::visit();
// 告诉编译器,GoodGay下的visit函数作为本类的好朋友,可以访问私有的成员.
public:
Building();
public:
string sittingRoom;
private:
string beadroom;
};
Building::Building()
{
sittingRoom = "客厅";
beadroom = "卧室";
}
GoodGay::GoodGay()
{
building = new Building;
}
void GoodGay::visit()
{
cout << "visit 函数正在访问" << building->sittingRoom << endl;
cout << "visit 函数正在访问" << building->beadroom << endl;
}
void GoodGay::visit2()
{
cout << "visit2 函数正在访问" << building->sittingRoom << endl;
// cout << "visit2 函数正在访问" << building->beadroom << endl; 报错
}
void test01()
{
GoodGay gg;
gg.visit();
gg.visit2();
}
int main()
{
test01();
system("pause");
return 0;
}
总结
方式 | 代码 |
---|---|
全局函数做友元 | friend 函数类型 函数名(参数); ,如 friend void test(int a); |
类做友元 | friend class 类名 ,如 friend class Test; |
成员函数做友元 | friend 函数类型 类名::函数名(参数); 如 friend void Test::test(int a ); |
转载:https://blog.csdn.net/ZripenYe/article/details/117200095
查看评论