C++友元函数friend使用的学习总结
- 1. 友元函数简介
- 1.1 使用友元函数的目的
- 1.2 友元函数的三种实现方法
- 2.全局函数做友元
- 3.类做友元
- 4.成员函数做友元
- 注意!
1. 友元函数简介
1.1 使用友元函数的目的
允许一个函数或者类访问另一个类中的私有成员,使得两个类可以共享同一数据。
举个例子,有亲戚去你家拜访,那么客厅是所有人可见的(public类),但自己的房间就不太方便了(private类),不过自己的基友或者闺蜜可以进入你的房间,这就需要友元函数,这就是friend。
1.2 友元函数的三种实现方法
- 全局函数做友元
- 类做友元
- 成员函数做友元
2.全局函数做友元
全局函数做友元,就是在类外定义一个全局函数,该全局函数传入一个类的指针或者引用。该类的公共成员可以直接调用,若将该全局函数作为友元写入类中,该函数就可调用私有成员。
代码如下:
#include <iostream>
using namespace std;
class House {
//设置全局函数bestFriend是类的好朋友,可以访问类中的私有成员m_BedRoom
friend void bestFriend(House& house);
public:
House()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom; //私有成员,卧室
};
//全局函数实现
void bestFriend(House &house) //引用或者指针都可以
{
cout << "好朋友全局函数 正在访问: " <<house.m_SittingRoom << endl;
cout << "好朋友全局函数 正在访问: " <<house.m_BedRoom<< endl;
}
void test01()
{
House house; //创建一个House类对象
bestFriend(house); //调用全局函数访问类中公有和私有成员
}
int main() {
test01();
return 0;
}
其中,主要代码就一行:
friend void bestFriend(House& house);
在这里,设置全局函数bestFriend()是House类的友元,然后就可以访问类中的私有成员。
如果没有声明该函数为House类友元,则程序会出现如下报错:
设置友元后的代码运行结果:
3.类做友元
类做友元,就是用类B中的函数去调用另一个类A中的私有成员,这需要在类A中将类B做为友元写入
#include <iostream>
using namespace std;
class House
{
//设置BestFriend为House类的友元,可以调用House的私有成员
friend class BestFriend;
public:
House()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom; //私有成员,卧室
};
class BestFriend
{
public:
BestFriend()
{
//创建House对象
house = new House;
}
void visit() //参观函数,访问House中的属性
{
cout << "好朋友正在访问: " << house->m_SittingRoom << endl;
cout << "好朋友正在访问: " << house->m_BedRoom << endl;
}
House* house;
};
void test01()
{
BestFriend bf; //创建好友对象
bf.visit(); //调用好友对象中的函数来访问House中的成员
}
int main()
{
test01();
return 0;
}
其中,主要代码为:
friend class BestFriend;
在这里,设置BestFriend为House类的友元,可以调用House的私有成员。
4.成员函数做友元
成员函数做友元,就是如果要在类B中使用函数去调用类A中的私有内容,需要提前在类A中将该成员函数声明为友元。
#include <iostream>
using namespace std;
class House; //先声明存在House这样一个类,因为BestFriend类中会调用到该类,而House类中也需要声明将BestFriend设置为友元
class BestFriend {
public:
BestFriend(); //此处只能先写出声明,需要在House类后再实现,原因与visit函数类似
void visit(); //让visit函数可以访问House中的私有内容
/*
注意!此处不能把函数内容写在此处,由于函数中使用到了House类中的私有内容,虽然上面提前声明了House类,但其私有内容还是不能获取,依然会报错提示未定义类型House::BedRoom不可访问,将该函数内容移动到House类后面就不会报错了,就当作顺便学习函数对外实现了吧哈哈
{
cout << "visit函数正在访问:" << house->m_SittingRoom << endl;
cout << "visit函数正在访问:" << house->m_BedRoom << endl;
}
*/
void visit2(); //让visit2函数不可以访问House中的私有内容
House* house;
};
class House {
//告诉编译器,BestFriend类中的visit成员函数是House类的友元,可以访问私有内容
friend void BestFriend::visit();
public:
House()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom; //私有成员,卧室
};
BestFriend::BestFriend()
{
house = new House; //生成一个House类的指针对象house
}
void BestFriend::visit()
{
cout << "visit函数正在访问:" << house->m_SittingRoom << endl;
cout << "visit函数正在访问:" << house->m_BedRoom << endl;
}
void BestFriend::visit2()
{
cout << "visit2函数正在访问:" << house->m_SittingRoom << endl;
//cout << "visit2函数正在访问:" << house->m_BedRoom << endl; //该行不可实现,因为该visit2函数不是House类的友元
}
void test()
{
BestFriend bf;
bf.visit();
bf.visit2();
}
int main()
{
test();
return 0;
}
其中,主要代码为:
friend void BestFriend::visit();
在这里,设置BestFriend类中的visit成员函数是House类的友元,可以访问House类中的私有内容。
注意!
与全局函数做友元所不同的是,类成员函数做友元不能把函数内容直接写在本类中,由于函数中使用到了House类中的私有内容,虽然之前提前声明了House类,但其私有内容还是不能获取,依然会报错提示House类中的私有成员不可访问:
但是,如果将该函数内容移动到House类后面就不会报错了,就当作顺便学习函数对外实现了吧哈哈~